diff --git a/.bingo/.gitignore b/.bingo/.gitignore index 9efccf683c..4428593c37 100755 --- a/.bingo/.gitignore +++ b/.bingo/.gitignore @@ -11,3 +11,4 @@ !variables.env *tmp.mod +*tmp.sum diff --git a/.bingo/README.md b/.bingo/README.md index 7a5c2d4f6d..7e7673362d 100755 --- a/.bingo/README.md +++ b/.bingo/README.md @@ -6,7 +6,6 @@ This is directory which stores Go modules with pinned buildable package that is * Run `bingo get ` to install that have own module file in this directory. * For Makefile: Make sure to put `include .bingo/Variables.mk` in your Makefile, then use $() variable where is the .bingo/.mod. * For shell: Run `source .bingo/variables.env` to source all environment variable for each tool. -* For go: Import `.bingo/variables.go` to for variable names. * See https://github.com/bwplotka/bingo or -h on how to add, remove or change binaries dependencies. ## Requirements diff --git a/.bingo/Variables.mk b/.bingo/Variables.mk index 2d7a9d7267..6227d0c6bf 100644 --- a/.bingo/Variables.mk +++ b/.bingo/Variables.mk @@ -1,4 +1,4 @@ -# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.8. DO NOT EDIT. +# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.9. DO NOT EDIT. # All tools are designed to be build inside $GOBIN. BINGO_DIR := $(dir $(lastword $(MAKEFILE_LIST))) GOPATH ?= $(shell go env GOPATH) @@ -17,29 +17,35 @@ GO ?= $(shell which go) # @echo "Running alertmanager" # @$(ALERTMANAGER) # -ALERTMANAGER := $(GOBIN)/alertmanager-v0.24.0 +ALERTMANAGER := $(GOBIN)/alertmanager-v0.27.0 $(ALERTMANAGER): $(BINGO_DIR)/alertmanager.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/alertmanager-v0.24.0" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=alertmanager.mod -o=$(GOBIN)/alertmanager-v0.24.0 "github.com/prometheus/alertmanager/cmd/alertmanager" + @echo "(re)installing $(GOBIN)/alertmanager-v0.27.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=alertmanager.mod -o=$(GOBIN)/alertmanager-v0.27.0 "github.com/prometheus/alertmanager/cmd/alertmanager" -BINGO := $(GOBIN)/bingo-v0.8.1-0.20230820182247-0568407746a2 +BINGO := $(GOBIN)/bingo-v0.9.0 $(BINGO): $(BINGO_DIR)/bingo.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/bingo-v0.8.1-0.20230820182247-0568407746a2" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=bingo.mod -o=$(GOBIN)/bingo-v0.8.1-0.20230820182247-0568407746a2 "github.com/bwplotka/bingo" + @echo "(re)installing $(GOBIN)/bingo-v0.9.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=bingo.mod -o=$(GOBIN)/bingo-v0.9.0 "github.com/bwplotka/bingo" -FAILLINT := $(GOBIN)/faillint-v1.11.0 +CAPNPC_GO := $(GOBIN)/capnpc-go-v3.0.1-alpha.2.0.20240830165715-46ccd63a72af +$(CAPNPC_GO): $(BINGO_DIR)/capnpc-go.mod + @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. + @echo "(re)installing $(GOBIN)/capnpc-go-v3.0.1-alpha.2.0.20240830165715-46ccd63a72af" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=capnpc-go.mod -o=$(GOBIN)/capnpc-go-v3.0.1-alpha.2.0.20240830165715-46ccd63a72af "capnproto.org/go/capnp/v3/capnpc-go" + +FAILLINT := $(GOBIN)/faillint-v1.13.0 $(FAILLINT): $(BINGO_DIR)/faillint.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/faillint-v1.11.0" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=faillint.mod -o=$(GOBIN)/faillint-v1.11.0 "github.com/fatih/faillint" + @echo "(re)installing $(GOBIN)/faillint-v1.13.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=faillint.mod -o=$(GOBIN)/faillint-v1.13.0 "github.com/fatih/faillint" -GOIMPORTS := $(GOBIN)/goimports-v0.12.0 +GOIMPORTS := $(GOBIN)/goimports-v0.23.0 $(GOIMPORTS): $(BINGO_DIR)/goimports.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/goimports-v0.12.0" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=goimports.mod -o=$(GOBIN)/goimports-v0.12.0 "golang.org/x/tools/cmd/goimports" + @echo "(re)installing $(GOBIN)/goimports-v0.23.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=goimports.mod -o=$(GOBIN)/goimports-v0.23.0 "golang.org/x/tools/cmd/goimports" GOJSONTOYAML := $(GOBIN)/gojsontoyaml-v0.1.0 $(GOJSONTOYAML): $(BINGO_DIR)/gojsontoyaml.mod @@ -47,11 +53,11 @@ $(GOJSONTOYAML): $(BINGO_DIR)/gojsontoyaml.mod @echo "(re)installing $(GOBIN)/gojsontoyaml-v0.1.0" @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=gojsontoyaml.mod -o=$(GOBIN)/gojsontoyaml-v0.1.0 "github.com/brancz/gojsontoyaml" -GOLANGCI_LINT := $(GOBIN)/golangci-lint-v1.54.1 +GOLANGCI_LINT := $(GOBIN)/golangci-lint-v1.61.0 $(GOLANGCI_LINT): $(BINGO_DIR)/golangci-lint.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/golangci-lint-v1.54.1" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=golangci-lint.mod -o=$(GOBIN)/golangci-lint-v1.54.1 "github.com/golangci/golangci-lint/cmd/golangci-lint" + @echo "(re)installing $(GOBIN)/golangci-lint-v1.61.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=golangci-lint.mod -o=$(GOBIN)/golangci-lint-v1.61.0 "github.com/golangci/golangci-lint/cmd/golangci-lint" GOTESPLIT := $(GOBIN)/gotesplit-v0.2.1 $(GOTESPLIT): $(BINGO_DIR)/gotesplit.mod @@ -95,11 +101,11 @@ $(MDOX): $(BINGO_DIR)/mdox.mod @echo "(re)installing $(GOBIN)/mdox-v0.9.1-0.20220713110358-25b9abcf90a0" @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=mdox.mod -o=$(GOBIN)/mdox-v0.9.1-0.20220713110358-25b9abcf90a0 "github.com/bwplotka/mdox" -MINIO := $(GOBIN)/minio-v0.0.0-20220720015624-ce8397f7d944 +MINIO := $(GOBIN)/minio-v0.0.0-20241014163537-3da7c9cce3de $(MINIO): $(BINGO_DIR)/minio.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/minio-v0.0.0-20220720015624-ce8397f7d944" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=minio.mod -o=$(GOBIN)/minio-v0.0.0-20220720015624-ce8397f7d944 "github.com/minio/minio" + @echo "(re)installing $(GOBIN)/minio-v0.0.0-20241014163537-3da7c9cce3de" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=minio.mod -o=$(GOBIN)/minio-v0.0.0-20241014163537-3da7c9cce3de "github.com/minio/minio" PROMDOC := $(GOBIN)/promdoc-v0.8.0 $(PROMDOC): $(BINGO_DIR)/promdoc.mod @@ -107,11 +113,11 @@ $(PROMDOC): $(BINGO_DIR)/promdoc.mod @echo "(re)installing $(GOBIN)/promdoc-v0.8.0" @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=promdoc.mod -o=$(GOBIN)/promdoc-v0.8.0 "github.com/plexsystems/promdoc" -PROMETHEUS := $(GOBIN)/prometheus-v0.37.0 +PROMETHEUS := $(GOBIN)/prometheus-v0.54.1 $(PROMETHEUS): $(BINGO_DIR)/prometheus.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/prometheus-v0.37.0" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=prometheus.mod -o=$(GOBIN)/prometheus-v0.37.0 "github.com/prometheus/prometheus/cmd/prometheus" + @echo "(re)installing $(GOBIN)/prometheus-v0.54.1" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=prometheus.mod -o=$(GOBIN)/prometheus-v0.54.1 "github.com/prometheus/prometheus/cmd/prometheus" PROMTOOL := $(GOBIN)/promtool-v0.47.0 $(PROMTOOL): $(BINGO_DIR)/promtool.mod @@ -131,9 +137,9 @@ $(PROTOC_GEN_GOGOFAST): $(BINGO_DIR)/protoc-gen-gogofast.mod @echo "(re)installing $(GOBIN)/protoc-gen-gogofast-v1.3.2" @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=protoc-gen-gogofast.mod -o=$(GOBIN)/protoc-gen-gogofast-v1.3.2 "github.com/gogo/protobuf/protoc-gen-gogofast" -SHFMT := $(GOBIN)/shfmt-v3.7.0 +SHFMT := $(GOBIN)/shfmt-v3.8.0 $(SHFMT): $(BINGO_DIR)/shfmt.mod @# Install binary/ries using Go 1.14+ build command. This is using bwplotka/bingo-controlled, separate go module with pinned dependencies. - @echo "(re)installing $(GOBIN)/shfmt-v3.7.0" - @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=shfmt.mod -o=$(GOBIN)/shfmt-v3.7.0 "mvdan.cc/sh/v3/cmd/shfmt" + @echo "(re)installing $(GOBIN)/shfmt-v3.8.0" + @cd $(BINGO_DIR) && GOWORK=off $(GO) build -mod=mod -modfile=shfmt.mod -o=$(GOBIN)/shfmt-v3.8.0 "mvdan.cc/sh/v3/cmd/shfmt" diff --git a/.bingo/alertmanager.mod b/.bingo/alertmanager.mod index 7bbcf7a978..2634e82284 100644 --- a/.bingo/alertmanager.mod +++ b/.bingo/alertmanager.mod @@ -1,5 +1,7 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT -go 1.14 +go 1.21 -require github.com/prometheus/alertmanager v0.24.0 // cmd/alertmanager +toolchain go1.23.1 + +require github.com/prometheus/alertmanager v0.27.0 // cmd/alertmanager diff --git a/.bingo/alertmanager.sum b/.bingo/alertmanager.sum index abe5d086ff..baff6979b3 100644 --- a/.bingo/alertmanager.sum +++ b/.bingo/alertmanager.sum @@ -3,6 +3,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -13,32 +14,193 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +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/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= 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/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= 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= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 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= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 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/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.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-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/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -48,28 +210,48 @@ 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/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= +github.com/armon/go-metrics v0.3.10/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/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= 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/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.43.11 h1:NebCNJ2QvsFCnsKT1ei98bfwTPEoO2qwtWT42tJ3N3Q= github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.50.8 h1:gY0WoOW+/Wz6XmYSgDH9ge3wnAevYDSQWPxxJvqAkP4= +github.com/aws/aws-sdk-go v1.50.8/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409 h1:Da6uN+CAo1Wf09Rz1U4i9QN8f0REjyNJ73BEwAq/paU= github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= 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.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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.0 h1:yTUvW7Vhb89inJ+8irsUqiWjh8iT6sQPZiQzI6ReGkA= @@ -77,26 +259,68 @@ github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tj 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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 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/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +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.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 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= @@ -106,12 +330,19 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 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-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= 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 v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -119,6 +350,8 @@ github.com/go-openapi/analysis v0.19.2 h1:ophLETFestFZHk3ji7niPEL4d466QjW+0Tdg5V github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.21.2 h1:hXFrOYFHUAMQdu6zwAiKKJHJQ8kqZs1ux/ru1P1wLJU= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= +github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= @@ -127,6 +360,8 @@ 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/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY= +github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= @@ -134,12 +369,16 @@ github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDB 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/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -147,18 +386,24 @@ github.com/go-openapi/loads v0.19.2 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFR github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= 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/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= +github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/runtime v0.23.1 h1:/Drg9R96eMmgKJHVWZADz78XbE39/6QiIiB45mc+epo= github.com/go-openapi/runtime v0.23.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= +github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto= +github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= 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/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= +github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= @@ -168,6 +413,8 @@ github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+W 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/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI= +github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -176,11 +423,17 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= +github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk8H7js= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.21.0 h1:+Wqk39yKOhfpLqNLEC0/eViCkzM5FVXVqrvt526+wcI= github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= +github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -213,18 +466,26 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= 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-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34= github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/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/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= 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= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -232,6 +493,8 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= @@ -248,13 +511,19 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -263,11 +532,19 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -275,33 +552,93 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= 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= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 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/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +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.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= 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/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/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 v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= +github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 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/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +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.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.4 h1:gkyML/r71w3FL8gUi74Vk76avkj/9lYAY9lvg0OcoGs= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.1 h1:MXgUXLqva1QvpVEDQW1IQLG0wivQAtmFlHRQ+1vWZfM= github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +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/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -317,6 +654,7 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -326,17 +664,28 @@ github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= 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/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 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= @@ -344,6 +693,9 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= @@ -355,26 +707,50 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ 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/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= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26 h1:gPxPSwALAeHJSjarOs00QjVdV9QoBvc1D2ujQUr5BzU= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= 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/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 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/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -394,65 +770,108 @@ github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +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.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= 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= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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/prometheus/alertmanager v0.20.0 h1:PBMNY7oyIvYMBBIag35/C0hO7xn8+35p4V5rNAph5N8= github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= 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/alertmanager v0.27.0 h1:V6nTa2J5V4s8TG4C4HtrBP/WNSebCCTYGGv4qecA/+I= +github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.2.1 h1:JnMpQc6ppsNgw9QPAGF6Dod479itz7lvlsMzzNayLOI= github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= +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.11.1/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.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/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/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= 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.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.46.0 h1:doXzt5ybi1HBKpsZOL0sSkaNHJJqkyfEWZGGqqScV0Y= +github.com/prometheus/common v0.46.0/go.mod h1:Tp0qkxpb9Jsg54QMe+EAmqXkSV7Evdy1BTn+g2pa/hQ= +github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= +github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= 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.7.1 h1:c6RXaK8xBVercEeUQ4tRNL8UGWzDHfvj9dseo1FcK1Y= github.com/prometheus/exporter-toolkit v0.7.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= +github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= +github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= 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.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/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +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/ryanuber/columnize v2.1.2+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef h1:RoeI7K0oZIcUirMHsFpQjTVDrl1ouNh8T7v3eNsUxL0= github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= 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/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= 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/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= @@ -465,41 +884,89 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= 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 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= +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/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= 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/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= 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= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= 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.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= +go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 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/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.17.0/go.mod h1:I2vmBGtFaODIVMBSTPVDlJSzBDNf93k60E6Ft0nyjo0= +go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= +go.opentelemetry.io/otel/sdk v1.17.0/go.mod h1:U87sE0f5vQB7hwUoW98pW5Rz4ZDuCFBZFNUBlSgmDFQ= +go.opentelemetry.io/otel/trace v1.17.0/go.mod h1:I/4vKTgFclIsXRVucpH25X0mpFSczM7aHeaz0ZBLWjY= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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= @@ -510,25 +977,52 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 h1:ZpKuNIejY8P0ExLOVyKhb0WsgG8UdvHXe6TWjY7eL6k= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/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-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/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-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/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-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -539,6 +1033,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -547,7 +1043,12 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -582,21 +1083,53 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R 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-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-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= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/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-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/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/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= 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= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +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-20211005180243-6b3c2da341f1/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/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= 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= @@ -609,12 +1142,17 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -631,6 +1169,7 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -640,6 +1179,7 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w 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-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-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -653,39 +1193,83 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/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-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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-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-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= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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-20210823070655-63515b42dcdf/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-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= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +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/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-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/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-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-20190206041539-40960b6deb8e/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= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -706,6 +1290,7 @@ golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtn 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-20190927191325-030b2cf1153e/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-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -733,12 +1318,38 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/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= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= 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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= 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= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -755,12 +1366,39 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +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/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 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/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= @@ -784,12 +1422,67 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/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-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 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-20201109203340-2640f1f9cdfb/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= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +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/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/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-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +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-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -802,6 +1495,27 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa 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= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +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.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/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +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= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -815,18 +1529,27 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 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-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= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/telebot.v3 v3.0.0 h1:UgHIiE/RdjoDi6nf4xACM7PU3TqiPVV9vvTydCEnrTo= gopkg.in/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg= +gopkg.in/telebot.v3 v3.2.1 h1:3I4LohaAyJBiivGmkfB+CiVu7QFOWkuZ4+KHgO/G3rs= +gopkg.in/telebot.v3 v3.2.1/go.mod h1:GJKwwWqp9nSkIVN51eRKU78aB5f5OnQuWdwiIZfPbko= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -837,6 +1560,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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -844,6 +1569,39 @@ 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= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 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/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/.bingo/bingo.mod b/.bingo/bingo.mod index 67623038b4..25cb672dc5 100644 --- a/.bingo/bingo.mod +++ b/.bingo/bingo.mod @@ -2,4 +2,4 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT go 1.14 -require github.com/bwplotka/bingo v0.8.1-0.20230820182247-0568407746a2 +require github.com/bwplotka/bingo v0.9.0 diff --git a/.bingo/bingo.sum b/.bingo/bingo.sum index 3d14fdcc96..74ce4ad6fc 100644 --- a/.bingo/bingo.sum +++ b/.bingo/bingo.sum @@ -4,6 +4,8 @@ github.com/bwplotka/bingo v0.6.0 h1:AlRrI9J/GVjOUSZbsYQ5WS8X8FnLpTbEAhUVW5iOQ7M= github.com/bwplotka/bingo v0.6.0/go.mod h1:/qx0tLceUEeAs1R8QnIF+n9+Q0xUe7hmdQTB2w0eDYk= github.com/bwplotka/bingo v0.8.1-0.20230820182247-0568407746a2 h1:nvLMMDf/Lw2JdJe2KzXjnL7IhIU+j48CXFZEuR9uPHQ= github.com/bwplotka/bingo v0.8.1-0.20230820182247-0568407746a2/go.mod h1:GxC/y/xbmOK5P29cn+B3HuOSw0s2gruddT3r+rDizDw= +github.com/bwplotka/bingo v0.9.0 h1:slnsdJYExR4iRalHR6/ZiYnr9vSazOuFGmc2LdX293g= +github.com/bwplotka/bingo v0.9.0/go.mod h1:GxC/y/xbmOK5P29cn+B3HuOSw0s2gruddT3r+rDizDw= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.15/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= diff --git a/.bingo/capnpc-go.mod b/.bingo/capnpc-go.mod new file mode 100644 index 0000000000..51f3bf45c4 --- /dev/null +++ b/.bingo/capnpc-go.mod @@ -0,0 +1,5 @@ +module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT + +go 1.23.1 + +require capnproto.org/go/capnp/v3 v3.0.1-alpha.2.0.20240830165715-46ccd63a72af // capnpc-go diff --git a/.bingo/capnpc-go.sum b/.bingo/capnpc-go.sum new file mode 100644 index 0000000000..6e97c04068 --- /dev/null +++ b/.bingo/capnpc-go.sum @@ -0,0 +1,6 @@ +capnproto.org/go/capnp/v3 v3.0.1-alpha.2.0.20240830165715-46ccd63a72af h1:A5wxH0ZidOtYYUGjhtBaRuB87M73bGfc06uWB8sHpg0= +capnproto.org/go/capnp/v3 v3.0.1-alpha.2.0.20240830165715-46ccd63a72af/go.mod h1:2vT5D2dtG8sJGEoEKU17e+j7shdaYp1Myl8X03B3hmc= +github.com/colega/zeropool v0.0.0-20230505084239-6fb4a4f75381 h1:d5EKgQfRQvO97jnISfR89AiCCCJMwMFoSxUiU0OGCRU= +github.com/colega/zeropool v0.0.0-20230505084239-6fb4a4f75381/go.mod h1:OU76gHeRo8xrzGJU3F3I1CqX1ekM8dfJw0+wPeMwnp0= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= diff --git a/.bingo/faillint.mod b/.bingo/faillint.mod index 449ca748b8..ee623ab941 100644 --- a/.bingo/faillint.mod +++ b/.bingo/faillint.mod @@ -2,4 +2,4 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT go 1.14 -require github.com/fatih/faillint v1.11.0 +require github.com/fatih/faillint v1.13.0 diff --git a/.bingo/faillint.sum b/.bingo/faillint.sum index e2578137b1..57701200c2 100644 --- a/.bingo/faillint.sum +++ b/.bingo/faillint.sum @@ -6,25 +6,43 @@ github.com/fatih/faillint v1.10.0 h1:NQ2zhSNuYp0g23/6gyCSi2IfdVIfOk/JkSzpWSDEnYQ github.com/fatih/faillint v1.10.0/go.mod h1:upblMxCjN4sL78nBbOHFEH9UGHTSw61M3Kj9BMS0UL0= github.com/fatih/faillint v1.11.0 h1:EhmAKe8k0Cx2gnf+/JiX/IAeeKjwsQao5dY8oG6cQB4= github.com/fatih/faillint v1.11.0/go.mod h1:d9kdQwFcr+wD4cLXOdjTw1ENUUvv5+z0ctJ5Wm0dTvA= +github.com/fatih/faillint v1.13.0 h1:9Dn9ZvK7bPTFmAkQ0FvhBRF4qD+LZg0ZgelyeBc7kKE= +github.com/fatih/faillint v1.13.0/go.mod h1:YiTDDtwQSL6MNRPtYG0n/rGE9orYt92aohq/P2QYBLA= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -35,12 +53,27 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w= @@ -49,6 +82,10 @@ golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= 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-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= diff --git a/.bingo/goimports.mod b/.bingo/goimports.mod index 65590410ca..44d8d131ed 100644 --- a/.bingo/goimports.mod +++ b/.bingo/goimports.mod @@ -2,4 +2,4 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT go 1.14 -require golang.org/x/tools v0.12.0 // cmd/goimports +require golang.org/x/tools v0.23.0 // cmd/goimports diff --git a/.bingo/goimports.sum b/.bingo/goimports.sum index b1b3a9f245..5912056404 100644 --- a/.bingo/goimports.sum +++ b/.bingo/goimports.sum @@ -1,3 +1,4 @@ +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= @@ -5,6 +6,10 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= @@ -12,6 +17,10 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -21,12 +30,19 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -40,11 +56,21 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -52,6 +78,10 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200526224456-8b020aee10d2 h1:21BqcH/onxtGHn1A2GDOJjZnbt4Nlez629S3eaR+eYs= @@ -62,6 +92,10 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= 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 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= diff --git a/.bingo/golangci-lint.mod b/.bingo/golangci-lint.mod index 95a2175e31..fd88f3233f 100644 --- a/.bingo/golangci-lint.mod +++ b/.bingo/golangci-lint.mod @@ -1,5 +1,7 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT -go 1.14 +go 1.22.1 -require github.com/golangci/golangci-lint v1.54.1 // cmd/golangci-lint +toolchain go1.23.1 + +require github.com/golangci/golangci-lint v1.61.0 // cmd/golangci-lint diff --git a/.bingo/golangci-lint.sum b/.bingo/golangci-lint.sum index d2b3bfc703..337a0345cf 100644 --- a/.bingo/golangci-lint.sum +++ b/.bingo/golangci-lint.sum @@ -40,51 +40,194 @@ cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Ud cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= +cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= +cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= +cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= +cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= +cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= +cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= +cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= +cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= +cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= +cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= +cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= +cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= +cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= +cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= +cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= +cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= +cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= +cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= 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/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= +cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= +cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= +cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= +cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= +cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= +cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= 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/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= +cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= +cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= +cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= +cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= +cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= +cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= +cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= +cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= +cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= +cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= +cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= +cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= +cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= +cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= +cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= +cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= +cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= +cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= +cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= +cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= +cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= +cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= +cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= +cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= +cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= +cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= +cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= +cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= +cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= +cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= +cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= 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= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= +cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= +cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= +cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= +cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= +cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= +cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= +cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= +cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= +cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= +cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= +cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 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= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= +cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= +cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= +cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= +cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= +cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= +cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= +cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= +cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= +cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= +cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= +cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= +cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/4meepo/tagalign v1.3.2 h1:1idD3yxlRGV18VjqtDbqYvQ5pXqQS0wO2dn6M3XstvI= github.com/4meepo/tagalign v1.3.2/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= +github.com/4meepo/tagalign v1.3.4 h1:P51VcvBnf04YkHzjfclN6BbsopfJR5rxs1n+5zHt+w8= +github.com/4meepo/tagalign v1.3.4/go.mod h1:M+pnkHH2vG8+qhE5bVc/zeP7HS/j910Fwa9TUSyZVI0= github.com/Abirdcfly/dupword v0.0.9 h1:MxprGjKq3yDBICXDgEEsyGirIXfMYXkLNT/agPsE1tk= github.com/Abirdcfly/dupword v0.0.9/go.mod h1:PzmHVLLZ27MvHSzV7eFmMXSFArWXZPZmfuuziuUrf2g= github.com/Abirdcfly/dupword v0.0.12 h1:56NnOyrXzChj07BDFjeRA+IUzSz01jmzEq+G4kEgFhc= github.com/Abirdcfly/dupword v0.0.12/go.mod h1:+us/TGct/nI9Ndcbcp3rgNcQzctTj68pq7TcgNpLfdI= +github.com/Abirdcfly/dupword v0.0.14 h1:3U4ulkc8EUo+CaT105/GJ1BQwtgyj6+VaBVbAX11Ba8= +github.com/Abirdcfly/dupword v0.0.14/go.mod h1:VKDAbxdY8YbKUByLGg8EETzYSuC4crm9WwI6Y3S0cLI= +github.com/Abirdcfly/dupword v0.1.1 h1:Bsxe0fIw6OwBtXMIncaTxCLHYO5BB+3mcsR5E8VXloY= +github.com/Abirdcfly/dupword v0.1.1/go.mod h1:B49AcJdTYYkpd4HjgAcutNGG9HZ2JWwKunH9Y2BA6sM= github.com/Antonboom/errname v0.1.6 h1:LzIJZlyLOCSu51o3/t2n9Ck7PcoP9wdbrdaW6J8fX24= github.com/Antonboom/errname v0.1.6/go.mod h1:7lz79JAnuoMNDAWE9MeeIr1/c/VpSUWatBv2FH9NYpI= github.com/Antonboom/errname v0.1.7 h1:mBBDKvEYwPl4WFFNwec1CZO096G6vzK9vvDQzAwkako= github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU= github.com/Antonboom/errname v0.1.10 h1:RZ7cYo/GuZqjr1nuJLNe8ZH+a+Jd9DaZzttWzak9Bls= github.com/Antonboom/errname v0.1.10/go.mod h1:xLeiCIrvVNpUtsN0wxAh05bNIZpqE22/qDMnTBTttiA= +github.com/Antonboom/errname v0.1.13 h1:JHICqsewj/fNckzrfVSe+T33svwQxmjC+1ntDsHOVvM= +github.com/Antonboom/errname v0.1.13/go.mod h1:uWyefRYRN54lBg6HseYCFhs6Qjcy41Y3Jl/dVhA87Ns= github.com/Antonboom/nilnil v0.1.1 h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q= github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= github.com/Antonboom/nilnil v0.1.5 h1:X2JAdEVcbPaOom2TUa1FxZ3uyuUlex0XMLGYMemu6l0= github.com/Antonboom/nilnil v0.1.5/go.mod h1:I24toVuBKhfP5teihGWctrRiPbRKHwZIFOvc6v3HZXk= +github.com/Antonboom/nilnil v0.1.9 h1:eKFMejSxPSA9eLSensFmjW2XTgTwJMjZ8hUHtV4s/SQ= +github.com/Antonboom/nilnil v0.1.9/go.mod h1:iGe2rYwCq5/Me1khrysB4nwI7swQvjclR8/YRPl5ihQ= +github.com/Antonboom/testifylint v1.3.1 h1:Uam4q1Q+2b6H7gvk9RQFw6jyVDdpzIirFOOrbs14eG4= +github.com/Antonboom/testifylint v1.3.1/go.mod h1:NV0hTlteCkViPW9mSR4wEMfwp+Hs1T3dY60bkvSfhpM= +github.com/Antonboom/testifylint v1.4.3 h1:ohMt6AHuHgttaQ1xb6SSnxCeK4/rnK7KKzbvs7DmEck= +github.com/Antonboom/testifylint v1.4.3/go.mod h1:+8Q9+AOLsz5ZiQiiYujJKs9mNz398+M6UgslP4qgJLA= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -96,7 +239,15 @@ github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c h1:pxW6RcqyfI9/kWtOwnv/G+AzdKuy2ZrqINhenH4HyNs= +github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Crocmagnon/fatcontext v0.2.2 h1:OrFlsDdOj9hW/oBEJBNSuH7QWf+E9WPVHw+x52bXVbk= +github.com/Crocmagnon/fatcontext v0.2.2/go.mod h1:WSn/c/+MMNiD8Pri0ahRj0o9jVpeowzavOQplBJw6u0= +github.com/Crocmagnon/fatcontext v0.5.2 h1:vhSEg8Gqng8awhPju2w7MKHqMlg4/NI+gSDHtR3xgwA= +github.com/Crocmagnon/fatcontext v0.5.2/go.mod h1:87XhRMaInHP44Q7Tlc7jkgKKB7kZAOPiDkFMdKCC+74= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= @@ -108,10 +259,19 @@ github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7I github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/GaijinEntertainment/go-exhaustruct/v3 v3.1.0 h1:3ZBs7LAezy8gh0uECsA6CGU43FF3zsx5f4eah5FxTMA= github.com/GaijinEntertainment/go-exhaustruct/v3 v3.1.0/go.mod h1:rZLTje5A9kFBe0pzhpe2TdhRniBF++PRHQuRpR8esVc= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0 h1:sATXp1x6/axKxz2Gjxv8MALP0bXaNRfQinEwyfMcx8c= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0/go.mod h1:Nl76DrGNJTA1KJ0LePKBw/vznBX1EHbAZX8mwjR82nI= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0 h1:/fTUt5vmbkAcMBt4YQiuC23cV0kEsN1MVMNqeOW43cU= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.0/go.mod h1:ONJg5sxcbsdQQ4pOW8TGdTidT2TMAUy/2Xhr8mrYaao= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -123,7 +283,17 @@ github.com/OpenPeeDeeP/depguard v1.1.1 h1:TSUznLjvp/4IUP+OQ0t/4jF4QUyxIcVX8YnghZ github.com/OpenPeeDeeP/depguard v1.1.1/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= github.com/OpenPeeDeeP/depguard/v2 v2.1.0 h1:aQl70G173h/GZYhWf36aE5H0KaujXfVMnn/f1kSDVYY= github.com/OpenPeeDeeP/depguard/v2 v2.1.0/go.mod h1:PUBgk35fX4i7JDmwzlJwJ+GMe6NfO1723wmJMgPThNQ= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= +github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSwwlWcT5a2FGK0c= +github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -131,6 +301,8 @@ 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/alexkohler/nakedret/v2 v2.0.2 h1:qnXuZNvv3/AxkAb22q/sEsEpcA99YxLFACDtEw9TPxE= github.com/alexkohler/nakedret/v2 v2.0.2/go.mod h1:2b8Gkk0GsOrqQv/gPWjNLDSKwG8I5moSXG1K4VIBcTQ= +github.com/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg= +github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.10 h1:qqGPDTV0ff0tWHN/nnIlSdjlU/EwRPaUY4SfpE1rnms= @@ -140,9 +312,14 @@ github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqr github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= 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= @@ -181,28 +358,49 @@ github.com/bombsimon/wsl/v3 v3.3.0 h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxj github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bombsimon/wsl/v3 v3.4.0 h1:RkSxjT3tmlptwfgEgTgU+KYKLI35p/tviNXNXiL2aNU= github.com/bombsimon/wsl/v3 v3.4.0/go.mod h1:KkIB+TXkqy6MvK9BDZVbZxKNYsE1/oLRJbIFtf14qqo= +github.com/bombsimon/wsl/v4 v4.2.1 h1:Cxg6u+XDWff75SIFFmNsqnIOgob+Q9hG6y/ioKbRFiM= +github.com/bombsimon/wsl/v4 v4.2.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo= +github.com/bombsimon/wsl/v4 v4.4.1 h1:jfUaCkN+aUpobrMO24zwyAMwMAV5eSziCkOKEauOLdw= +github.com/bombsimon/wsl/v4 v4.4.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI= github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= github.com/breml/bidichk v0.2.4 h1:i3yedFWWQ7YzjdZJHnPo9d/xURinSq3OM+gyM43K4/8= github.com/breml/bidichk v0.2.4/go.mod h1:7Zk0kRFt1LIZxtQdl9W9JwGAcLTTkOs+tN7wuEYGJ3s= +github.com/breml/bidichk v0.2.7 h1:dAkKQPLl/Qrk7hnP6P+E0xOodrq8Us7+U0o4UBOAlQY= +github.com/breml/bidichk v0.2.7/go.mod h1:YodjipAGI9fGcYM7II6wFvGhdMYsC5pHDlGzqvEW3tQ= github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw= github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/breml/errchkjson v0.3.1 h1:hlIeXuspTyt8Y/UmP5qy1JocGNR00KQHgfaNtRAjoxQ= github.com/breml/errchkjson v0.3.1/go.mod h1:XroxrzKjdiutFyW3nWhw34VGg7kiMsDQox73yWCGI2U= +github.com/breml/errchkjson v0.3.6 h1:VLhVkqSBH96AvXEyclMR37rZslRrY2kcyq+31HCsVrA= +github.com/breml/errchkjson v0.3.6/go.mod h1:jhSDoFheAF2RSDOlCfhHO9KqhZgAYLyvHe7bRCX8f/U= github.com/butuzov/ireturn v0.1.1 h1:QvrO2QF2+/Cx1WA/vETCIYBKtRjc30vesdoPUNo1EbY= github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= github.com/butuzov/ireturn v0.2.0 h1:kCHi+YzC150GE98WFuZQu9yrTn6GEydO2AuPLbTgnO4= github.com/butuzov/ireturn v0.2.0/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0= +github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA= github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= +github.com/butuzov/mirror v1.2.0 h1:9YVK1qIjNspaqWutSv8gsge2e/Xpq1eqEkslEUHy5cs= +github.com/butuzov/mirror v1.2.0/go.mod h1:DqZZDtzm42wIAIyHXeN8W/qb1EPlb9Qn/if9icBOpdQ= +github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc= +github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50= +github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= +github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= 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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charithe/durationcheck v0.0.6 h1:Tsy7EppNow2pDC0jN7Hsmcb6mHd71ZbI1vFissRBtc0= github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy6EEutYk= @@ -217,22 +415,36 @@ github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 h1:cy5GCEZLUCshCGC github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348/go.mod h1:f/miWtG3SSuTxKsNK3o58H1xl+XV6ZIfbC6p7lPPB8U= github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8 h1:W9o46d2kbNL06lq7UNDPV0zYLzkrde/bjIqO02eoll0= github.com/chavacava/garif v0.0.0-20230227094218-b8c73b2037b8/go.mod h1:gakxgyXaaPkxvLw1XQxNGK4I37ys9iBRzNUx/B7pUCo= +github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= +github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= 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/ckaznocha/intrange v0.1.2 h1:3Y4JAxcMntgb/wABQ6e8Q8leMd26JbX2790lIss9MTI= +github.com/ckaznocha/intrange v0.1.2/go.mod h1:RWffCw/vKBwHeOEwWdCikAtY0q4gGt8VhJZEEA5n+RE= +github.com/ckaznocha/intrange v0.2.0 h1:FykcZuJ8BD7oX93YbO1UY9oZtkRbp+1/kJcDjkefYLs= +github.com/ckaznocha/intrange v0.2.0/go.mod h1:r5I7nUlAAG56xmkOpw4XVr16BXhwYTUdcuRFeevn1oE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= 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= @@ -251,11 +463,13 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 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/cristalhq/acmd v0.7.0/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cristalhq/acmd v0.8.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/cristalhq/acmd v0.11.1/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= +github.com/cristalhq/acmd v0.12.0/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ= github.com/curioswitch/go-reassign v0.1.2 h1:ekM07+z+VFT560Exz4mTv0/s1yU9gem6CJc/tlYpkmI= github.com/curioswitch/go-reassign v0.1.2/go.mod h1:bFJIHgtTM3hRm2sKXSPkbwNjSFyGURQXyn4IXD2qwfQ= github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= @@ -272,18 +486,26 @@ github.com/daixiang0/gci v0.9.0 h1:t8XZ0vK6l0pwPoOmoGyqW2NwQlvbpAQNVvu/GRBgykM= github.com/daixiang0/gci v0.9.0/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= github.com/daixiang0/gci v0.11.0 h1:XeQbFKkCRxvVyn06EOuNY6LPGBLVuB/W130c8FrnX6A= github.com/daixiang0/gci v0.11.0/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= +github.com/daixiang0/gci v0.13.4 h1:61UGkmpoAcxHM2hhNkZEf5SzwQtWJXTSws7jaPyqwlw= +github.com/daixiang0/gci v0.13.4/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= +github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c= +github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= +github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= +github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= github.com/denis-tingajkin/go-header v0.4.2 h1:jEeSF4sdv8/3cT/WY8AgDHUoItNSoEZ7qg9dX7pc218= github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= 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/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/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -294,15 +516,19 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m 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/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/esimonov/ifshort v1.0.2 h1:K5s1W2fGfkoWXsFlxBNqT6J0ZCncPaKrGM5qe0bni68= github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= +github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= +github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= @@ -313,15 +539,22 @@ github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/firefart/nonamedreturns v1.0.1 h1:fSvcq6ZpK/uBAgJEGMvzErlzyM4NELLqqdTofVjVNag= github.com/firefart/nonamedreturns v1.0.1/go.mod h1:D3dpIBojGGNh5UfElmwPu73SwDCm+VKhHYqwlNOk2uQ= github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= +github.com/firefart/nonamedreturns v1.0.5 h1:tM+Me2ZaXs8tfdDw3X6DOX++wMCOqzYUho6tUTYIdRA= +github.com/firefart/nonamedreturns v1.0.5/go.mod h1:gHJjDqhGM4WyPt639SOZs+G89Ko7QKH5R5BhnO6xJhw= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -339,6 +572,8 @@ github.com/fzipp/gocyclo v0.5.1/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlya github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghostiam/protogetter v0.3.6 h1:R7qEWaSgFCsy20yYHNIJsU9ZOb8TziSRRxuAOTVKeOk= +github.com/ghostiam/protogetter v0.3.6/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= github.com/go-critic/go-critic v0.5.5 h1:hqPHqQt/2l4Syc2VOIgcuy0FSytcbatOHWggu45vhw8= github.com/go-critic/go-critic v0.5.5/go.mod h1:eMs1Oc/oIP+CYNVN09M+XZYffIPuRHawxzlggAPN9Kk= github.com/go-critic/go-critic v0.6.2 h1:L5SDut1N4ZfsWZY0sH4DCrsHLHnhuuWak2wa165t9gs= @@ -351,27 +586,41 @@ github.com/go-critic/go-critic v0.6.5 h1:fDaR/5GWURljXwF8Eh31T2GZNz9X4jeboS912mW github.com/go-critic/go-critic v0.6.5/go.mod h1:ezfP/Lh7MA6dBNn4c6ab5ALv3sKnZVLx37tr00uuaOY= github.com/go-critic/go-critic v0.9.0 h1:Pmys9qvU3pSML/3GEQ2Xd9RZ/ip+aXHKILuxczKGV/U= github.com/go-critic/go-critic v0.9.0/go.mod h1:5P8tdXL7m/6qnyG6oRAlYLORvoXH0WDypYgAEmagT40= +github.com/go-critic/go-critic v0.11.4 h1:O7kGOCx0NDIni4czrkRIXTnit0mkyKOCePh3My6OyEU= +github.com/go-critic/go-critic v0.11.4/go.mod h1:2QAdo4iuLik5S9YG0rT4wcZ8QxwHYkrr6/2MWAiv/vc= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 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-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/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= 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-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= @@ -395,6 +644,8 @@ github.com/go-toolsmith/astequal v1.0.3 h1:+LVdyRatFS+XO78SGV4I3TCEA0AC7fKEGma+f github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= github.com/go-toolsmith/astequal v1.1.0 h1:kHKm1AWqClYn15R0K1KKE4RG614D46n+nqUQ06E1dTw= github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= +github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= @@ -416,23 +667,36 @@ github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYw github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-viper/mapstructure/v2 v2.0.0 h1:dhn8MZ1gZ0mzeodTG3jt5Vj/o87xZKuNAprG2mQfMfc= +github.com/go-viper/mapstructure/v2 v2.0.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= +github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 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/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= 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= @@ -471,6 +735,7 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= @@ -483,6 +748,10 @@ github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2 h1:amWTbTGqOZ71ruzrdA+Nx5WA3tV1N0goTspwmKCQvBY= github.com/golangci/gofmt v0.0.0-20220901101216-f2edd75033f2/go.mod h1:9wOXstvyDRshQ9LggQuzBCGysxs3b6Uo/1MvYCR2NMs= +github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e h1:ULcKCDV1LOZPFxGZaA6TlQbiM3J2GCPnkx/bGF6sX/g= +github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e/go.mod h1:Pm5KhLPA8gSnQwrQ6ukebRcapGb/BG9iUkdaiCcGHJM= +github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9 h1:/1322Qns6BtQxUZDTAT4SdcoxknUki7IAoK4SAXr8ME= +github.com/golangci/gofmt v0.0.0-20240816233607-d8596aa466a9/go.mod h1:Oesb/0uFAyWoaw1U1qS5zyjCg5NP9C9iwjnI4tIsXEE= github.com/golangci/golangci-lint v1.39.1-0.20210330125642-6844f6abf817 h1:/cj909lXJ48yCH1dmtF7mrm8qH/+aUR15PsC5Oz9SA4= github.com/golangci/golangci-lint v1.39.1-0.20210330125642-6844f6abf817/go.mod h1:tUZzmjq/sO4QmwvxzN5LhVvStPu3OgHtijV8Oqoc/fQ= github.com/golangci/golangci-lint v1.45.2 h1:9I3PzkvscJkFAQpTQi5Ga0V4qWdJERajX1UZ7QqkW+I= @@ -497,6 +766,10 @@ github.com/golangci/golangci-lint v1.51.1 h1:N5HD/x0ZrhJYsgKWyz7yJxxQ8JKR0Acc+FO github.com/golangci/golangci-lint v1.51.1/go.mod h1:hnyNNO3fJ2Rjwo6HM+VXvcmLkKDOuBAnR9gVlS1mW1E= github.com/golangci/golangci-lint v1.54.1 h1:0qMrH1gkeIBqCZaaAm5Fwq4xys9rO/lJofHfZURIFFk= github.com/golangci/golangci-lint v1.54.1/go.mod h1:JK47+qksV/t2mAz9YvndwT0ZLW4A1rvDljOs3g9jblo= +github.com/golangci/golangci-lint v1.59.1 h1:CRRLu1JbhK5avLABFJ/OHVSQ0Ie5c4ulsOId1h3TTks= +github.com/golangci/golangci-lint v1.59.1/go.mod h1:jX5Oif4C7P0j9++YB2MMJmoNrb01NJ8ITqKWNLewThg= +github.com/golangci/golangci-lint v1.61.0 h1:VvbOLaRVWmyxCnUIMTbf1kDsaJbTzH20FAMXTAlQGu8= +github.com/golangci/golangci-lint v1.61.0/go.mod h1:e4lztIrJJgLPhWvFPDkhiMwEFRrWlmFbrZea3FsJyN8= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= @@ -507,18 +780,29 @@ github.com/golangci/misspell v0.4.0 h1:KtVB/hTK4bbL/S6bs64rYyk8adjmh1BygbBiaAiX+ github.com/golangci/misspell v0.4.0/go.mod h1:W6O/bwV6lGDxUCChm2ykw9NQdd5bYd1Xkjo88UcWyJc= github.com/golangci/misspell v0.4.1 h1:+y73iSicVy2PqyX7kmUefHusENlrP9YwuHZHPLGQj/g= github.com/golangci/misspell v0.4.1/go.mod h1:9mAN1quEo3DlpbaIKKyEvRxK1pwqR9s/Sea1bJCtlNI= +github.com/golangci/misspell v0.6.0 h1:JCle2HUTNWirNlDIAUO44hUsKhOFqGPoC4LZxlaSXDs= +github.com/golangci/misspell v0.6.0/go.mod h1:keMNyY6R9isGaSAu+4Q8NMBwMPkh15Gtc8UCVoDtAWo= +github.com/golangci/modinfo v0.3.4 h1:oU5huX3fbxqQXdfspamej74DFX0kyGLkw1ppvXoJ8GA= +github.com/golangci/modinfo v0.3.4/go.mod h1:wytF1M5xl9u0ij8YSvhkEVPP3M5Mc7XLl1pxH3B2aUM= +github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= +github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5 h1:c9Mqqrm/Clj5biNaG7rABrmwUq88nHh0uABo2b/WYmc= github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2 h1:SgM7GDZTxtTTQPU84heOxy34iG5Du7F2jcoZnvp+fXI= github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= +github.com/golangci/revgrep v0.5.3 h1:3tL7c1XBMtWHHqVpS5ChmiAAoe4PF/d5+ULzV9sLAzs= +github.com/golangci/revgrep v0.5.3/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs= +github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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= @@ -538,11 +822,15 @@ 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-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -560,13 +848,17 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/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-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 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= @@ -574,12 +866,16 @@ 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/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= github.com/gookit/color v1.5.2/go.mod h1:w8h4bGiHeeBpvQVePTutdbERIUf3oJE5lZ8HM0UgXyg= github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE= +github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 h1:Nb2aRlC404yz7gQIfRZxX9/MLvQiqXyiBTJtgAy6yrI= @@ -590,6 +886,8 @@ github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28 h1:9alfqbr github.com/gordonklaus/ineffassign v0.0.0-20230107090616-13ace0543b28/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601 h1:mrEEilTAUmaAORhssPPkxj84TsHrPMLBGW2Z4SoTxm8= github.com/gordonklaus/ineffassign v0.0.0-20230610083614-0e73809eb601/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= +github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= 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= @@ -624,6 +922,8 @@ 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.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= 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.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= @@ -657,6 +957,8 @@ github.com/hashicorp/go-version v1.4.0 h1:aAQzgqIrRKRa7w75CKpbBxYsmUoPjzVm1W59ca github.com/hashicorp/go-version v1.4.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -682,16 +984,23 @@ github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63 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-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jgautheron/goconst v1.4.0 h1:hp9XKUpe/MPyDamUbfsrGpe+3dnY2whNK4EtB86dvLM= github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jgautheron/goconst v1.7.1 h1:VpdAG7Ca7yvvJk5n8dMwQhfEZJh95kl/Hl9S1OI5Jkk= +github.com/jgautheron/goconst v1.7.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= github.com/jingyugao/rowserrcheck v0.0.0-20210315055705-d907ca737bb1 h1:4Rlb26NqzNtbDH69CRpr0vZooj3jAlXTycWCX3xRYAY= github.com/jingyugao/rowserrcheck v0.0.0-20210315055705-d907ca737bb1/go.mod h1:TOQpc2SLx6huPfoFGK3UOnEG+u02D3C1GeosjupAKCA= @@ -699,6 +1008,10 @@ github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjz github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jjti/go-spancheck v0.6.1 h1:ZK/wE5Kyi1VX3PJpUO2oEgeoI4FWOUm7Shb2Gbv5obI= +github.com/jjti/go-spancheck v0.6.1/go.mod h1:vF1QkOO159prdo6mHRxak2CpzDpHAfKiPUDP/NeRnX8= +github.com/jjti/go-spancheck v0.6.2 h1:iYtoxqPMzHUPp7St+5yA8+cONdyXD3ug6KK15n7Pklk= +github.com/jjti/go-spancheck v0.6.2/go.mod h1:+X7lvIrR5ZdUTkxFYqzJ0abr8Sb5LOo80uOhWNqIrYA= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= @@ -706,6 +1019,7 @@ github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhB github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/josharian/txtarfs v0.0.0-20210218200122-0702f000015a/go.mod h1:izVPOvVRsHiKkeGCT6tYBNWyDVuzj9wAaBb5R9qamfw= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -724,9 +1038,14 @@ github.com/julz/importas v0.0.0-20210228071311-d0bf5cb4e1db h1:ZmwBthGFMVAieuVpL github.com/julz/importas v0.0.0-20210228071311-d0bf5cb4e1db/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/junk1tm/musttag v0.4.4 h1:VK4L7v7lvWAhKDDx0cUJgbb0UBNipYinv8pPeHJzH9Q= github.com/junk1tm/musttag v0.4.4/go.mod h1:XkcL/9O6RmD88JBXb+I15nYRl9W4ExhgQeCBEhfMC8U= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/karamaru-alpha/copyloopvar v1.1.0 h1:x7gNyKcC2vRBO1H2Mks5u1VxQtYvFiym7fCjIP8RPos= +github.com/karamaru-alpha/copyloopvar v1.1.0/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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= @@ -738,16 +1057,23 @@ github.com/kisielk/errcheck v1.6.2 h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7 github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= +github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0= +github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.3 h1:l4pNvrb8JSwRd51ojtcOxOeHJzHek+MtOyXbaR0uvmw= github.com/kkHAIKE/contextcheck v1.1.3/go.mod h1:PG/cwd6c0705/LM0KTr1acO2gORUxkSVWyLJOFW5qoo= github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= +github.com/kkHAIKE/contextcheck v1.1.5 h1:CdnJh63tcDe53vG+RebdpdXJTc9atMgGqdx8LXxiilg= +github.com/kkHAIKE/contextcheck v1.1.5/go.mod h1:O930cpht4xb1YQpK+1+AgoM3mFsvxr7uyFptcnWTYUA= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -755,6 +1081,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -776,27 +1103,36 @@ github.com/kunwardeep/paralleltest v1.0.6 h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoa github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= github.com/kunwardeep/paralleltest v1.0.8 h1:Ul2KsqtzFxTlSU7IP0JusWlLiNqQaloB9vguyjbE558= github.com/kunwardeep/paralleltest v1.0.8/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= +github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs= +github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= +github.com/lasiar/canonicalheader v1.1.1 h1:wC+dY9ZfiqiPwAexUApFush/csSPXeIi4QqyxXmng8I= +github.com/lasiar/canonicalheader v1.1.1/go.mod h1:cXkb3Dlk6XXy+8MVQnF23CYKWlyA7kfQhSw2CcZtZb0= github.com/ldez/gomoddirectives v0.2.1 h1:9pAcW9KRZW7HQjFwbozNvFMcNVwdCBufU7os5QUwLIY= github.com/ldez/gomoddirectives v0.2.1/go.mod h1:sGicqkRgBOg//JfpXwkB9Hj0X5RyJ7mlACM5B9f6Me4= github.com/ldez/gomoddirectives v0.2.2 h1:p9/sXuNFArS2RLc+UpYZSI4KQwGMEDWC/LbtF5OPFVg= github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= +github.com/ldez/gomoddirectives v0.2.4 h1:j3YjBIjEBbqZ0NKtBNzr8rtMHTOrLPeiwTkfUJZ3alg= +github.com/ldez/gomoddirectives v0.2.4/go.mod h1:oWu9i62VcQDYp9EQ0ONTfqLNh+mDLWWDO+SO0qSQw5g= github.com/ldez/tagliatelle v0.3.1 h1:3BqVVlReVUZwafJUwQ+oxbx2BEX2vUG4Yu/NOfMiKiM= github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/ldez/tagliatelle v0.4.0 h1:sylp7d9kh6AdXN2DpVGHBRb5guTVAgOxqNGhbqc4b1c= github.com/ldez/tagliatelle v0.4.0/go.mod h1:mNtTfrHy2haaBAw+VT7IBV6VXBThS7TCreYWbBcJ87I= github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leonklingele/grouper v1.1.0 h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg= github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= +github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= +github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -811,6 +1147,10 @@ github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCE github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= +github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= github.com/magefile/mage v1.13.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -820,6 +1160,7 @@ github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaW github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ= @@ -856,6 +1197,8 @@ github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peK github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -863,6 +1206,7 @@ github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/Qd github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -883,12 +1227,18 @@ github.com/mgechev/revive v1.2.5 h1:UF9AR8pOAuwNmhXj2odp4mxv9Nx2qUIwVz8ZsU+Mbec= github.com/mgechev/revive v1.2.5/go.mod h1:nFOXent79jMTISAfOAasKfy0Z2Ejq0WX7Qn/KAdYopI= github.com/mgechev/revive v1.3.2 h1:Wb8NQKBaALBJ3xrrj4zpwJwqwNA6nDpyJSEQWcCka6U= github.com/mgechev/revive v1.3.2/go.mod h1:UCLtc7o5vg5aXCwdUTU1kEBQ1v+YXPAkYDIDXbrs5I0= +github.com/mgechev/revive v1.3.7 h1:502QY0vQGe9KtYJ9FpxMz9rL+Fc/P13CI5POL4uHCcE= +github.com/mgechev/revive v1.3.7/go.mod h1:RJ16jUbF0OWC3co/+XTxmFNgEpUPwnnA0BRllX2aDNA= +github.com/mgechev/revive v1.3.9 h1:18Y3R4a2USSBF+QZKFQwVkBROUda7uoBlkEuBD+YD1A= +github.com/mgechev/revive v1.3.9/go.mod h1:+uxEIr5UH0TjXWHTno3xh4u7eg6jDpXKzQccA9UGhHU= 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.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= 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/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -919,6 +1269,8 @@ github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EH github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= +github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= +github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= github.com/mozilla/tls-observatory v0.0.0-20210209181001-cf43108d6880/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/mozilla/tls-observatory v0.0.0-20210609171429-7bc42856d2e5/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= @@ -943,6 +1295,8 @@ github.com/nishanths/exhaustive v0.9.5 h1:TzssWan6orBiLYVqewCG8faud9qlFntJE30ACp github.com/nishanths/exhaustive v0.9.5/go.mod h1:IbwrGdVMizvDcIxPYGVdQn5BqWJaOwpCvg4RGb8r/TA= github.com/nishanths/exhaustive v0.11.0 h1:T3I8nUGhl/Cwu5Z2hfc92l0e04D2GEW6e0l8pzda2l0= github.com/nishanths/exhaustive v0.11.0/go.mod h1:RqwDsZ1xY0dNdqHho2z6X+bgzizwbLYOWnZbbl2wLB4= +github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= +github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= github.com/nishanths/predeclared v0.2.1 h1:1TXtjmy4f3YCFjTxRd8zcFHOmoUir+gp0ESzjFzG2sw= github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= @@ -952,6 +1306,8 @@ github.com/nunnatsa/ginkgolinter v0.8.1 h1:/y4o/0hV+ruUHj4xXh89xlFjoaitnI4LnkpuY github.com/nunnatsa/ginkgolinter v0.8.1/go.mod h1:FYYLtszIdmzCH8XMaMPyxPVXZ7VCaIm55bA+gugx+14= github.com/nunnatsa/ginkgolinter v0.13.3 h1:wEvjrzSMfDdnoWkctignX9QTf4rT9f4GkQ3uVoXBmiU= github.com/nunnatsa/ginkgolinter v0.13.3/go.mod h1:aTKXo8WddENYxNEFT+4ZxEgWXqlD9uMD3w9Bfw/ABEc= +github.com/nunnatsa/ginkgolinter v0.16.2 h1:8iLqHIZvN4fTLDC0Ke9tbSZVcyVHoBs0HIbnVSxfHJk= +github.com/nunnatsa/ginkgolinter v0.16.2/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= @@ -979,6 +1335,7 @@ github.com/onsi/ginkgo/v2 v2.9.0/go.mod h1:4xkjoL/tZv4SMWeww56BU5kAt19mVB47gTWxm github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo= github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts= github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= +github.com/onsi/ginkgo/v2 v2.17.3/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= @@ -997,12 +1354,16 @@ github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfad github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw= github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ= github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 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= @@ -1019,9 +1380,17 @@ github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -1029,6 +1398,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1044,9 +1414,14 @@ github.com/polyfloyd/go-errorlint v1.0.6 h1:ZevdyEGxDoHAMQUVvdTT06hnYuKULe8TQkOm github.com/polyfloyd/go-errorlint v1.0.6/go.mod h1:NcnNncnm8fVV7vfQWiI4HZrzWFzGp24C262IQutNcMs= github.com/polyfloyd/go-errorlint v1.4.3 h1:P6NALOLV8BrWhm6PsqOraUK05E5h8IZnpXYJ+CIg+0U= github.com/polyfloyd/go-errorlint v1.4.3/go.mod h1:VPlWPh6hB/wruVG803SuNpLuTGNjLHYlvcdSy4RhdPA= +github.com/polyfloyd/go-errorlint v1.5.2 h1:SJhVik3Umsjh7mte1vE0fVZ5T1gznasQG3PV7U5xFdA= +github.com/polyfloyd/go-errorlint v1.5.2/go.mod h1:sH1QC1pxxi0fFecsVIzBmxtrgd9IF/SkJpA6wqyKAJs= +github.com/polyfloyd/go-errorlint v1.6.0 h1:tftWV9DE7txiFzPpztTAwyoRLKNj9gpVm2cg8/OwcYY= +github.com/polyfloyd/go-errorlint v1.6.0/go.mod h1:HR7u8wuP1kb1NeN1zqTd1ZMlqUKPPHF+Id4vIPvDqVw= 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/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 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= @@ -1062,6 +1437,8 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/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/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1098,6 +1475,10 @@ github.com/quasilyte/go-ruleguard v0.3.18 h1:sd+abO1PEI9fkYennwzHn9kl3nqP6M5vE7F github.com/quasilyte/go-ruleguard v0.3.18/go.mod h1:lOIzcYlgxrQ2sGJ735EHXmf/e9MJ516j16K/Ifcttvs= github.com/quasilyte/go-ruleguard v0.4.0 h1:DyM6r+TKL+xbKB4Nm7Afd1IQh9kEUKQs2pboWGKtvQo= github.com/quasilyte/go-ruleguard v0.4.0/go.mod h1:Eu76Z/R8IXtViWUIHkE3p8gdH3/PKk1eh3YGfaEof10= +github.com/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs= +github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= +github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1 h1:+Wl/0aFp0hpuHM3H//KMft64WQ1yX9LdJY64Qm/gFCo= +github.com/quasilyte/go-ruleguard v0.4.3-0.20240823090925-0fe6f58b47b1/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.1/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.12-0.20220101150716-969a394a9451/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= @@ -1106,6 +1487,7 @@ github.com/quasilyte/go-ruleguard/dsl v0.3.16/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQ github.com/quasilyte/go-ruleguard/dsl v0.3.17/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.19/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= github.com/quasilyte/go-ruleguard/rules v0.0.0-20210203162857-b223e0831f88/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= @@ -1125,6 +1507,8 @@ github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/go-dbus v0.0.0-20121104212943-b7232d34b1d5/go.mod h1:+u151txRmLpwxBmpYn9z3d1sdJdjRPQpsXuYeY9jNls= github.com/remyoudompheng/go-liblzma v0.0.0-20190506200333-81bf2d431b96/go.mod h1:90HvCY7+oHHUKkbeMCiHt1WuFR2/hPJ9QrljDG+v6ls= github.com/remyoudompheng/go-misc v0.0.0-20190427085024-2d6ac652a50e/go.mod h1:80FQABjoFzZ2M5uEa6FUaJYEmqU2UOKojlFVak1UAwI= @@ -1136,10 +1520,13 @@ github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryancurrah/gomodguard v1.2.0 h1:YWfhGOrXwLGiqcC/u5EqG6YeS8nh+1fw0HEc85CVZro= github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= github.com/ryancurrah/gomodguard v1.2.3 h1:ww2fsjqocGCAFamzvv/b8IsRduuHHeK2MHTcTxZTQX8= @@ -1148,10 +1535,16 @@ github.com/ryancurrah/gomodguard v1.2.4 h1:CpMSDKan0LtNGGhPrvupAoLeObRFjND8/tU1r github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= github.com/ryancurrah/gomodguard v1.3.0 h1:q15RT/pd6UggBXVBuLps8BXRvl5GPBcwVA7BJHMLuTw= github.com/ryancurrah/gomodguard v1.3.0/go.mod h1:ggBxb3luypPEzqVtq33ee7YSN35V28XeGnid8dnni50= +github.com/ryancurrah/gomodguard v1.3.2 h1:CuG27ulzEB1Gu5Dk5gP8PFxSOZ3ptSdP5iI/3IXxM18= +github.com/ryancurrah/gomodguard v1.3.2/go.mod h1:LqdemiFomEjcxOqirbQCb3JFvSxH2JUYMerTFd3sF2o= +github.com/ryancurrah/gomodguard v1.3.5 h1:cShyguSwUEeC0jS7ylOiG/idnd1TpJ1LfHGpV3oJmPU= +github.com/ryancurrah/gomodguard v1.3.5/go.mod h1:MXlEPQRxgfPQa62O8wzK3Ozbkv9Rkqr+wKjSxTdsNJE= github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanrolds/sqlclosecheck v0.4.0 h1:i8SX60Rppc1wRuyQjMciLqIzV3xnoHB7/tXbr6RGYNI= github.com/ryanrolds/sqlclosecheck v0.4.0/go.mod h1:TBRRjzL31JONc9i4XMinicuo+s+E8yKZ5FN8X3G6CKQ= +github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= +github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig= @@ -1164,6 +1557,8 @@ github.com/sanposhiho/wastedassign/v2 v2.0.6 h1:+6/hQIHKNJAUixEj6EmOngGIisyeI+T3 github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.13.0 h1:uObNudVEEHf6JbOJy5bgKJloA1bWjxR9fwgNFpPzKnI= @@ -1172,6 +1567,10 @@ github.com/sashamelentyev/usestdlibvars v1.21.1 h1:GQGlReyL9Ek8DdJmwtwhHbhwHnuPf github.com/sashamelentyev/usestdlibvars v1.21.1/go.mod h1:MPI52Qq99iO9sFZZcKJ2y/bx6BNjs+/2bw3PCggIbew= github.com/sashamelentyev/usestdlibvars v1.23.0 h1:01h+/2Kd+NblNItNeux0veSL5cBF1jbEOPrEhDzGYq0= github.com/sashamelentyev/usestdlibvars v1.23.0/go.mod h1:YPwr/Y1LATzHI93CqoPUN/2BzGQ/6N/cl/KwgR0B/aU= +github.com/sashamelentyev/usestdlibvars v1.26.0 h1:LONR2hNVKxRmzIrZR0PhSF3mhCAzvnr+DcUiHgREfXE= +github.com/sashamelentyev/usestdlibvars v1.26.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= +github.com/sashamelentyev/usestdlibvars v1.27.0 h1:t/3jZpSXtRPRf2xr0m63i32ZrusyurIGT9E5wAvXQnI= +github.com/sashamelentyev/usestdlibvars v1.27.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/securego/gosec/v2 v2.7.0 h1:mOhJv5w6UyNLpSssQOQCc7eGkKLuicAxvf66Ey/X4xk= github.com/securego/gosec/v2 v2.7.0/go.mod h1:xNbGArrGUspJLuz3LS5XCY1EBW/0vABAl/LWfSklmiM= @@ -1187,6 +1586,10 @@ github.com/securego/gosec/v2 v2.14.0 h1:U1hfs0oBackChXA72plCYVA4cOlQ4gO+209dHiSN github.com/securego/gosec/v2 v2.14.0/go.mod h1:Ff03zEi5NwSOfXj9nFpBfhbWTtROCkg9N+9goggrYn4= github.com/securego/gosec/v2 v2.16.0 h1:Pi0JKoasQQ3NnoRao/ww/N/XdynIB9NRYYZT5CyOs5U= github.com/securego/gosec/v2 v2.16.0/go.mod h1:xvLcVZqUfo4aAQu56TNv7/Ltz6emAOQAEsrZrt7uGlI= +github.com/securego/gosec/v2 v2.20.1-0.20240525090044-5f0084eb01a9 h1:rnO6Zp1YMQwv8AyxzuwsVohljJgp4L0ZqiCgtACsPsc= +github.com/securego/gosec/v2 v2.20.1-0.20240525090044-5f0084eb01a9/go.mod h1:dg7lPlu/xK/Ut9SedURCoZbVCR4yC7fM65DtH9/CDHs= +github.com/securego/gosec/v2 v2.21.2 h1:deZp5zmYf3TWwU7A7cR2+SolbTpZ3HQiwFqnzQyEl3M= +github.com/securego/gosec/v2 v2.21.2/go.mod h1:au33kg78rNseF5PwPnTWhuYBFf534bvJRvOrgZ/bFzU= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= @@ -1197,6 +1600,7 @@ github.com/shirou/gopsutil/v3 v3.22.6/go.mod h1:EdIubSnZhbAvBS1yJ7Xi+AShB/hxwLHO github.com/shirou/gopsutil/v3 v3.22.7/go.mod h1:s648gW4IywYzUfE/KjXxUsqrqx/T2xO5VqOXxONeRfI= github.com/shirou/gopsutil/v3 v3.23.1/go.mod h1:NN6mnm5/0k8jw4cBfCnJtr5L7ErOTg18tMNpgFkn0hA= github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= @@ -1228,6 +1632,8 @@ github.com/sivchari/tenv v1.7.0 h1:d4laZMBK6jpe5PWepxlV9S+LC0yXqvYHiq8E6ceoVVE= github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/sivchari/tenv v1.10.0 h1:g/hzMA+dBCKqGXgW8AV/1xIWhAvDrx0zFKNR48NFMg0= +github.com/sivchari/tenv v1.10.0/go.mod h1:tdY24masnVoZFxYrHv/nD6Tc8FbkEtAQEEziXpyMgqY= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 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= @@ -1247,6 +1653,8 @@ github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= @@ -1266,6 +1674,8 @@ github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= @@ -1299,6 +1709,8 @@ github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -1319,6 +1731,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs= @@ -1344,6 +1758,10 @@ github.com/tetafro/godot v1.4.4 h1:VAtLEoAMmopIzHVWVBrztjVWDeYm1OD/DKqhqXR4828= github.com/tetafro/godot v1.4.4/go.mod h1:FVDd4JuKliW3UgjswZfJfHq4vAx0bD/Jd5brJjGeaz4= github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/tetafro/godot v1.4.16 h1:4ChfhveiNLk4NveAZ9Pu2AN8QZ2nkUGFuadM9lrr5D0= +github.com/tetafro/godot v1.4.16/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= +github.com/tetafro/godot v1.4.17 h1:pGzu+Ye7ZUEFx7LHU0dAKmCOXWsPjl7qA6iMGndsjPs= +github.com/tetafro/godot v1.4.17/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94 h1:ig99OeTyDwQWhPe2iw9lwfQVF1KB3Q4fpP3X7/2VBG8= github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro= @@ -1362,10 +1780,12 @@ github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyV github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= 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-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -1381,6 +1801,10 @@ github.com/tomarrell/wrapcheck/v2 v2.8.0 h1:qDzbir0xmoE+aNxGCPrn+rUSxAX+nG6vREgb github.com/tomarrell/wrapcheck/v2 v2.8.0/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQpIXDJRhQ= github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= +github.com/tomarrell/wrapcheck/v2 v2.8.3 h1:5ov+Cbhlgi7s/a42BprYoxsr73CbdMUTzE3bRDFASUs= +github.com/tomarrell/wrapcheck/v2 v2.8.3/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= +github.com/tomarrell/wrapcheck/v2 v2.9.0 h1:801U2YCAjLhdN8zhZ/7tdjB3EnAoRlJHt/s+9hijLQ4= +github.com/tomarrell/wrapcheck/v2 v2.9.0/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= github.com/tommy-muehle/go-mnd/v2 v2.3.1 h1:a1S4+4HSXDJMgeODJH/t0EEKxcVla6Tasw+Zx9JJMog= github.com/tommy-muehle/go-mnd/v2 v2.3.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= @@ -1398,6 +1822,8 @@ github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFO github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= +github.com/ultraware/whitespace v0.1.1 h1:bTPOGejYFulW3PkcrqkeQwOd6NKOOXvmGD9bo/Gk8VQ= +github.com/ultraware/whitespace v0.1.1/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= 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/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs= @@ -1408,6 +1834,10 @@ github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842 github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= github.com/uudashr/gocognit v1.0.7 h1:e9aFXgKgUJrQ5+bs61zBigmj7bFJ/5cC6HmMahVzuDo= github.com/uudashr/gocognit v1.0.7/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= +github.com/uudashr/gocognit v1.1.2 h1:l6BAEKJqQH2UpKAPKdMfZf5kE4W/2xk8pfU1OVLvniI= +github.com/uudashr/gocognit v1.1.2/go.mod h1:aAVdLURqcanke8h3vg35BC++eseDm66Z7KmchI5et4k= +github.com/uudashr/gocognit v1.1.3 h1:l+a111VcDbKfynh+airAy/DJQKaXh2m9vkoysMPSZyM= +github.com/uudashr/gocognit v1.1.3/go.mod h1:aKH8/e8xbTRBwjbCkwZ8qt4l2EpKXl31KMHgSS+lZ2U= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= @@ -1418,6 +1848,8 @@ github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7Fw github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/xen0n/gosmopolitan v1.2.1 h1:3pttnTuFumELBRSh+KQs1zcz4fN6Zy7aB0xlnQSn1Iw= github.com/xen0n/gosmopolitan v1.2.1/go.mod h1:JsHq/Brs1o050OOdmzHeOr0N7OtlnKRAGAsElF8xBQA= +github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= +github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= @@ -1429,8 +1861,12 @@ github.com/yeya24/promlinter v0.1.1-0.20210918184747-d757024714a1 h1:YAaOqqMTstE github.com/yeya24/promlinter v0.1.1-0.20210918184747-d757024714a1/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= +github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= +github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= github.com/ykadowak/zerologlint v0.1.3 h1:TLy1dTW3Nuc+YE3bYRPToG1Q9Ej78b5UUN6bjbGdxPE= github.com/ykadowak/zerologlint v0.1.3/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= +github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= +github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= @@ -1444,6 +1880,9 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= gitlab.com/bosi/decorder v0.2.1 h1:ehqZe8hI4w7O4b1vgsDZw1YU1PE7iJXrQWFMsocbQ1w= gitlab.com/bosi/decorder v0.2.1/go.mod h1:6C/nhLSbF6qZbYD8bRmISBwc6vcWdNsiIBkRvjJFrH0= gitlab.com/bosi/decorder v0.2.2 h1:LRfb3lP6mZWjUzpMOCLTVjcnl/SqZWBWmKNqQvMocQs= @@ -1452,7 +1891,16 @@ gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= gitlab.com/bosi/decorder v0.4.0 h1:HWuxAhSxIvsITcXeP+iIRg9d1cVfvVkmlF7M68GaoDY= gitlab.com/bosi/decorder v0.4.0/go.mod h1:xarnteyUoJiOTEldDysquWKTVDCKo2TOIOIibSuWqOg= +gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= +gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= go-simpler.org/assert v0.5.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= +go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= +go-simpler.org/musttag v0.12.2 h1:J7lRc2ysXOq7eM8rwaTYnNrHd5JwjppzB6mScysB2Cs= +go-simpler.org/musttag v0.12.2/go.mod h1:uN1DVIasMTQKk6XSik7yrJoEysGtR2GRqvWnI9S7TYM= +go-simpler.org/sloglint v0.7.1 h1:qlGLiqHbN5islOxjeLXoPtUdZXb669RW+BDQ+xOSNoU= +go-simpler.org/sloglint v0.7.1/go.mod h1:OlaVDRh/FKKd4X4sIMbsz8st97vomydceL146Fthh/c= +go-simpler.org/sloglint v0.7.2 h1:Wc9Em/Zeuu7JYpl+oKoYOsQSy2X560aVueCW/m6IijY= +go-simpler.org/sloglint v0.7.2/go.mod h1:US+9C80ppl7VsThQclkM7BkCHQAzuz8kHLsW3ppuluo= 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.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= @@ -1478,7 +1926,9 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 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/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.tmz.dev/musttag v0.7.1 h1:9lFmeSFnFfPuMq4IksHGomItE6NgKMNW2Nt2FPOhCfU= go.tmz.dev/musttag v0.7.1/go.mod h1:oJLkpR56EsIryktZJk/B0IroSMi37YWver47fibGh5U= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1486,6 +1936,8 @@ 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 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.1.11/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= @@ -1528,10 +1980,15 @@ golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0 golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1544,6 +2001,10 @@ golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfU golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQJHQdp89IZBA/+azVC4= golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk= +golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e h1:qyrTQ++p1afMkO4DPEeLGq/3oTsdlvdH4vqZUBWzUKM= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -1555,8 +2016,21 @@ golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a/go.mod h1:AbB0pIl golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 h1:jWGQJV4niP+CCmFW9ekjA9Zx8vYORzOUH2/Nl5WPuLQ= golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8= +golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1596,6 +2070,10 @@ golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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= @@ -1672,6 +2150,7 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= 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= @@ -1692,6 +2171,7 @@ golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ 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/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= 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= @@ -1715,6 +2195,10 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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= @@ -1780,6 +2264,7 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46 h1:V066+OYJ66oTjnhm4Yrn7SXIwSCiDQJxpBxmvqb1N1c= golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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= @@ -1816,6 +2301,7 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158 h1:rm+CHSpPEEW2IsXUib1ThaHIjuBVZjxNgSKmBLFfD4c= 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-20220319134239-a9b59b0215f8/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-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1851,6 +2337,11 @@ golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= 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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1865,6 +2356,7 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1888,17 +2380,25 @@ golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/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-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/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-20190206041539-40960b6deb8e/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-20190228203856-589c23e65e65/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= @@ -1920,6 +2420,7 @@ golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/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-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/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= @@ -1978,6 +2479,7 @@ golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/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= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -2027,6 +2529,10 @@ golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss= golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= 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= @@ -2035,6 +2541,15 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T 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/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= 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= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2074,8 +2589,10 @@ 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/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2131,6 +2648,7 @@ google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -2168,8 +2686,13 @@ google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX 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-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= 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-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f/go.mod h1:iIgEblxoG4klcXsG0d9cpoxJ4xndv6+1FkDROCHhPRI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -2206,6 +2729,7 @@ google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5 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/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= 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= @@ -2224,11 +2748,16 @@ google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+Rur 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= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 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-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= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -2287,6 +2816,38 @@ honnef.co/go/tools v0.4.0 h1:lyXVV1c8wUBJRKqI8JgIpT8TW1VDagfYYaxbKa/HoL8= honnef.co/go/tools v0.4.0/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= +honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs= +honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= +honnef.co/go/tools v0.5.1 h1:4bH5o3b5ZULQ4UrBmP+63W9r7qIkqJClEA9ko5YKx+I= +honnef.co/go/tools v0.5.1/go.mod h1:e9irvo83WDG9/irijV44wr3tbhcFeRnfpVlRqVwpzMs= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= mvdan.cc/gofumpt v0.1.1 h1:bi/1aS/5W00E2ny5q65w9SnKpWEF/UIOqDYBILpo9rA= mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= mvdan.cc/gofumpt v0.3.0 h1:kTojdZo9AcEYbQYhGuLf/zszYthRdhDNDUi2JKTxas4= @@ -2297,6 +2858,10 @@ mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= +mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= +mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= +mvdan.cc/gofumpt v0.7.0 h1:bg91ttqXmi9y2xawvkuMXyvAA/1ZGJqYAEGjXuP0JXU= +mvdan.cc/gofumpt v0.7.0/go.mod h1:txVFJy/Sc/mvaycET54pV8SW8gWxTlUuGHVEcncmNUo= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= @@ -2309,7 +2874,10 @@ mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 h1:seuXWbRB1qPrS3NQnHmFKLJLt mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk= mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f h1:lMpcwN6GxNbWtbpI1+xzFLSW8XzX0u72NttUGVFjO3U= +mvdan.cc/unparam v0.0.0-20240528143540-8a5130ca722f/go.mod h1:RSLa7mKKCNeTTMHBw5Hsy2rfJmd6O2ivt9Dw9ZqCQpQ= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 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/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/.bingo/minio.mod b/.bingo/minio.mod index 3330ac5952..b5e2101e07 100644 --- a/.bingo/minio.mod +++ b/.bingo/minio.mod @@ -1,5 +1,7 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT -go 1.14 +go 1.22 -require github.com/minio/minio v0.0.0-20220720015624-ce8397f7d944 +toolchain go1.23.1 + +require github.com/minio/minio v0.0.0-20241014163537-3da7c9cce3de diff --git a/.bingo/minio.sum b/.bingo/minio.sum index e2b5ea4006..97ba6f4123 100644 --- a/.bingo/minio.sum +++ b/.bingo/minio.sum @@ -1,4 +1,10 @@ +aead.dev/mem v0.2.0 h1:ufgkESS9+lHV/GUjxgc2ObF43FLZGSemh+W+y27QFMI= +aead.dev/mem v0.2.0/go.mod h1:4qj+sh8fjDhlvne9gm/ZaMRIX9EkmDrKOLwmyDtoMWM= +aead.dev/minisign v0.2.0/go.mod h1:zdq6LdSd9TbuSxchxwhpA9zEb9YXcVGoE8JakuiGaIQ= +aead.dev/minisign v0.3.0 h1:8Xafzy5PEVZqYDNP60yJHARlW1eOQtsKNp/Ph2c0vRA= +aead.dev/minisign v0.3.0/go.mod h1:NLvG3Uoq3skkRMDuc3YHpWUTMTrSExqm+Ij73W13F6Y= bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= 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= @@ -22,6 +28,7 @@ cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -33,37 +40,709 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.12/go.mod h1:wvyt8Okohbq1i8/aPbCMBNwGQFZaNli5d+1qa/5zgGo= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.12/go.mod h1:EmaVYmffq+2jA2waP0/XHECDkaOKVztxVsdzl65t8hw= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.24.0/go.mod h1:NpavJSb6TSO56hGpX1+4JL7js6AkKl27TEqzW9Sn7E4= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.12/go.mod h1:2RX6Op78cxqMtENfJW8kKpwtBCFVJGyvBtSR9l6v7aM= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.12/go.mod h1:/DSr1IlfzrXeKjS6c3+8P04avr+4U5S7J3F69SNGFkY= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.8.10/go.mod h1:3uJa4XfNqvhIvKksKEE7UahxZY1/2Uj07cCfT/RJZZM= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.12/go.mod h1:31Ib+S1sYnRQmCtfGqEf6EfzsiYy98EuDtLlvmpmx6U= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.12/go.mod h1:W94qTbrwhzGimOeoClrGdm5DAkMGlg/V6Maldra5QM8= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.14/go.mod h1:lPHksFcKpcZRrhGNx87a6SSygv0hfWi6Cd0gnWIUU4U= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.19.6/go.mod h1:UsijVGuWC6uml/+ODlL+mv6e3dZ52fbdOfOkiv4f0cE= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.12/go.mod h1:yYnk9icCH5XEkqjJinBNBDv5mSvi1FYhpA9Q+BpTwew= +cloud.google.com/go/auth v0.9.1 h1:+pMtLEV2k0AXKvs/tGZojuj6QaioxfUjOpMsG5Gtx+w= +cloud.google.com/go/auth v0.9.1/go.mod h1:Sw8ocT5mhhXxFklyhT12Eiy0ed6tTrPMCJjSI8KhYLk= +cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= +cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.12/go.mod h1:Rw8hmEIlKyvdhbFXjLrLvM2qNKZNwf5oraS5DervadE= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.2.11/go.mod h1:bqthxNtU+n3gwWxoyXVR9VdSqIfVcgmpYtBlXQkeWq8= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.9.4/go.mod h1:qqfXThFPI9dyDK1PfidiEOM/MrS+jUQualcQJytJCLA= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v1.0.11/go.mod h1:V0EIXuYoyqKkHfnNCYZrNv6M+WYWJGIr5h019LurF3I= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.62.0/go.mod h1:5ee+ZkF1x/ntgCsFQJAQTM3QkAZOecfCmvxhkJsWRSA= +cloud.google.com/go/bigtable v1.29.0/go.mod h1:5p909nNdWaNUcWs6KGZO8mI5HUovstlmrIi7+eA5PTQ= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.18.10/go.mod h1:Lt+Qrjqsde38l/h1+9fzu44Pv9t+Suyf/p973mrg+xU= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.8.8/go.mod h1:D7B3gkNPdZ1Zj2IEyfypDTgbwFgTWE2SE6Csz0f46jg= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.8.6/go.mod h1:ZsK7vU+XFDfSRwOqB4GjAGzawIIA3dWPXaFC9I5Jsts= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.17.12/go.mod h1:DoVQacEH1YuNqIZVN8v67cXGxaUyOgjrst+/+pkVqWU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.16.6/go.mod h1:Y7+6WFO8pT53rG0Lve6OZoO4+RkVTHGnHG7EB3uNiQw= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.7.11/go.mod h1:rPNK0gJEkF2//rdxhCKhx+IFBlzkObOZhlhvDY1JKCE= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.12.13/go.mod h1:53OmmKqQTocrbeCL13cuaryBQOflyO8s4NxuRHJlXgc= 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/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/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.27.5 h1:iii9Z+FhEeZ5cUkGOEqU+GM7MJSyxMgbE7H7j+JndYY= +cloud.google.com/go/compute v1.27.5/go.mod h1:DfwDGujFTdSeiE8b8ZqadF/uxHFBz+ekGsk8Zfi9dTA= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.13.7/go.mod h1:N5D7yxGknC0pDUC1OKOLShGQwpidKizKu3smt08153U= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.38.1/go.mod h1:2r4Qiz6IG2LhRFfWhPNmrYD7yzdE2B2kghigVWoSw/g= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.12.2/go.mod h1:XF/U1ZJ9kXfl8HWRzuWMtEtzBb8SvJ0zvySrxrQA3N0= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.21.1/go.mod h1:23qsWWm592aQHwZ4or7VDjNhx7DeNklHAPE3GM47d1U= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.12/go.mod h1:+2+80N2FOdDFWYhZdC2uTlX7GHP5kOH4vPNtfadggqQ= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.9.9/go.mod h1:QkiXNcrbFGjYtPtTkn700sfBiGIOG4mmpt26Ds8Ixeg= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.12/go.mod h1:ZUaEMjNVppM5ZasVt87QE0jN57O0LKY3uFe67EQ0GGI= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.12/go.mod h1:IBbWnl80akCFj7jZ89/dRB/juuXig+QrQoLg24+vidg= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.18.3/go.mod h1:wcfVhUr529uu9aZSy9WIUUdOCrkB8M5Gikfh3YUuGtE= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.5.4/go.mod h1:rpxihxKtWjPl8MDwjGiYgMva8nEWQSyzvl3e0p4ATt4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.12/go.mod h1:86JdVMqh3521atZY1P7waaa50vzIbErTLY7gsio+umg= 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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.19.0/go.mod h1:KGzkszuj87VT8tJe67GuB+qLolfsOt6bZq/KFuWaahc= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.10.11/go.mod h1:0d9em/ERaof15lY5JU3pWKF7ZJOHiPKcNJsTCBz6TX8= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.21.2/go.mod h1:BDBWUXXCBGrvYxVmSYXIRdNffioym0ChQWDQS0c/wA8= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.56.0/go.mod h1:P1hIske3kr9pSl11nEP4tFfAu2E4US+7PpboeBhM4ag= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.17.0/go.mod h1:9LuCkaCRZxWZ6HyqkmV3/PW0gKIVKoUVNjf0yMKVqMs= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.32.0/go.mod h1:X8skObtXBvR31QF+jERAu4mOCpRiJBaqbMvB3FLnMsA= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.12/go.mod h1:2YamnZleyO3y5zYV+oASWAUoiHBJ0ZmkEcO6MXs5x3c= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.2.6/go.mod h1:4jyHt4ytGLL8P0S3m6umOL8bJhTw4tVnDUcPQCGlNMM= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/errorreporting v0.3.1/go.mod h1:6xVQXU1UuntfAf+bVkFk6nld41+CPyF2NSPCyXE3Ztk= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.13/go.mod h1:52AB7Qmi6TBzA/lsSZER7oi4jR/pY0TXC0lNaaAyfA4= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.13.11/go.mod h1:1PJ+icw2mJYgqUsICg7Cr8gzMw38f3THiSzVSNPFrNQ= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.8.8/go.mod h1:gNT7bpDZSOFWCnRirQw1IehZtA7blbzkO3Q8VQfkeZ0= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.16.0/go.mod h1:+22v/7p+WNBSQwdSwP57vz47aZiY+HrDkrOsJNhk7rg= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.18.0/go.mod h1:r8uxxI35hdP2slfTjGJvx04NRy8sP/EXUMZ0NYfBd+w= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.5.5/go.mod h1:C/XZ2LoG+V97xGc18oCPniO754E0iHt0OXqKatawBMM= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.12/go.mod h1:+SpnnnUx4Xs/mWBJbqC7Mlu9Vv7riQlHSDS1T1ek2+U= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.12/go.mod h1:CNYNBCqjIkE9L70gzbRxZOsc++Wcp2oCLkfuytOFqRM= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v1.2.5/go.mod h1:zVRNlO7/jFXmvrkBd+UfhI2T7ZBb+N3b3lt/3K60uS0= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.9/go.mod h1:j8hBcywIqtJ3/3QP9yYB/LqjLWBM9dXumBa+xplvyG0= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.12/go.mod h1:hqTWzMXCgS/BPuyiWHzDBZC4K3+a9lcJWBUR+i+6D7A= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.2.0 h1:Ouq6qif4mZdXkb3SiFMpxvu0JQJB1Yid9TsZ23N6hg8= cloud.google.com/go/iam v0.2.0/go.mod h1:BCK88+tmjAwnZYfOSizmKCTSFjJHCa18t3DpdGEY13Y= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.2.0 h1:kZKMKVNk/IsSSc/udOb83K0hL/Yh/Gcqpz+oAkoIFN8= +cloud.google.com/go/iam v1.2.0/go.mod h1:zITGuWgsLZxd8OwAlX+eMFgZDXzBm7icj1PVTYG766Q= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.9.11/go.mod h1:UcvTLqySIc8C3Dw3JPZ7QihzzxVQJ7/KUOL9MjxiPZk= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.12/go.mod h1:SH2yjlk9fKWrRgob/E0Gd1wM+VFztfTdR+LaJRDMiPw= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.12/go.mod h1:8ntlg5OWnVodAsbs0KDLY58tKEroy+CYciDX/ONxpl4= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.18.5/go.mod h1:yXunGUGzabH8rjUPImp2ndHiGolHeWJJ0LODLedicIY= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.13.1/go.mod h1:PY/DAdVW0p2MWl2Lut31AJddEmQBBXMnPUM8nkl/WfA= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.12/go.mod h1:si0In2nxVPtZnSoDNlEgSV4BJWxxlkdgKh+LXPYMf4w= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.11.0/go.mod h1:5LDiJC/RxTt+fHc1LAt20R9TKiUTReDg6RuuFOZ67+A= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.5.12/go.mod h1:S5hMV8CDJ6r50t2ubVJSKQVv5u0rmik5//KgLO3k4lU= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.12/go.mod h1:7KrCfXlxPw85nhlEYF3o5oLC8RtQakMAIGKNiNN3OAg= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.11.7/go.mod h1:CEGHM/Q0epp0oWFO7kiEk8oDGUUhjd1sj4Rcd/4iwGU= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.12/go.mod h1:owrIOMto4hzsoqkZe95ePEiMJv4JF7/tgEgWuHC+t40= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.12/go.mod h1:OfG2zgIXVTNJy2UKDF4o4irKxBqTx9RMZhGKJ/hLJUI= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.13.11/go.mod h1:aeP+V0Xs3SLqu4mrQWRyuSg5+fdyPq+kdu1xclnR8y8= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.20.4/go.mod h1:v7F/UcLRw15EX7xq565N7Ae5tnYEE28+Cl717aTXG4c= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.14.11/go.mod h1:XRA6nT7ygTN09gAtCRsFhbqn3u7/9LIUn6S+5G4fs50= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.13.7/go.mod h1:foi1eLe3Ayydrr63O3ViMwG1AGS3/BxRSmXpAqMFhkY= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.12/go.mod h1:Id0HGMKFJemLolvsoECda71vU2T9JByGPYct6LgMxrw= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.11.10/go.mod h1:2d3Lwdm5VTxZzxY94V8TffNBk0FBnORieiVBeN+n9QQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.6.10/go.mod h1:qWX4Kv90NeBgPfoRwyMbISe8M7Ql1LAOFPNFuOqIvUI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.9.7/go.mod h1:Mgtuci4LszRSzKkQucdWvdhTyG+QB4+3ZpsZ4sqalrQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.12.8/go.mod h1:WHkLGqHILPnMgJ4UTdag6YgztVIgWS+T5T6tywH3cSM= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.13.3/go.mod h1:gIFyyriC1ANob8SnpwrQ6jjNroRwItoBOYfqiG3LkUU= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.13.8/go.mod h1:rc52yAdMXB5mERVeOXRcDnaswQNFTPRJ93VVHmGwJSk= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.12/go.mod h1:tkR+cZBpRdu4i04BP1CqaZr2yL7U1o8t+v/SZ2kOSDU= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.10.10/go.mod h1:9S7SKOsLydGB2u91WKNjHpLScxxkKATIu3Co0fw8LPQ= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.12/go.mod h1:Sl292f/1xY0igI+CFNGfiXJWiN9BvaLpc8mjnCHNRnA= 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= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/pubsub v1.4.0/go.mod h1:LFrqilwgdw4X2cJS9ALgzYmMu+ULyrUN6IHV3CPK4TM= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.42.0/go.mod h1:KADJ6s4MbTwhXmse/50SebEhE4SmUwHi48z3/dHar1Y= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.14.3/go.mod h1:MiSHAXwja4btHPJFNJrDke//V+x83/ckXcdwbzn4+e8= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.12/go.mod h1:A3c39mOVC4utWlwk+MpchvkZTM6MSJXm3KUwTQ47VzA= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.12.8/go.mod h1:zoJL8kPJJotOoNU3D2fCXW33vhbyIPe0Sq7ObhYLnGM= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.16.5/go.mod h1:cWn6WHSEnmVZh9lJ9AN/UwDTtvlcT+TTRGvNIckUbG0= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.12/go.mod h1:unouv9x3+I+6kVeE10LGM3oJ8aQrUZganWnRchitbAM= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.7.5/go.mod h1:voqqKzYIrnoAqFKV6xk2qhgTnxzfGCJNOuBnHJEzcNU= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.17.5/go.mod h1:DSWPessLdnuvRH+N2FY+j1twyKtpRDKp4Y88dm7VqBw= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.4.1/go.mod h1:gaXIpytRDfrJjb3pz9PRG2q2KUaDDDV+Uvmq6QRZH20= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.13/go.mod h1:lDJItkp2hNrCsHOBtVExCzjXBzK9WI3yKNg713/OU4s= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.13.6/go.mod h1:x2ySyOrqv3WGFRFn2Xk10iHmNmvmcEVSSqc30eb1bhw= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.17.5/go.mod h1:MA8w7SbQAQO9CQ9r0R7HR0F7g1AJoqx87SFLpapq3OU= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.34.0/go.mod h1:7esjYVxn7k0nm02CnLNueFWD40FH0eunhookSEUalSs= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.11.12/go.mod h1:A0mXC1awKEK5alkG7p3hxaHtb5SSPqAdeWx09RTIOGY= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.12/go.mod h1:QxxwQMvXqDUTYgMwbO7Y2Z6rojGzA7q64aQTCEj7xfM= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.67.0/go.mod h1:Um+TNmxfcCHqNCKid4rmAMvoe/Iu1vdz6UfxJ9GPxRQ= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.24.1/go.mod h1:th/IKNidPLzrbaEiKLIhTv/oTGADe4r4bzxZvYG62EE= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= +cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.11/go.mod h1:AMAR/PTS5yKPp1FHP6rk3eJYGmHF14vQYiHddcIgoOA= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.13/go.mod h1:jqjQzIF7ZPCxFSdsfhgUF0wGB+mbytYzyUqaHLiQcQg= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.12/go.mod h1:B1Xck47Mhy/PJMnvrLkv0gfKGinGP78c0XFZjWB7TdY= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.12/go.mod h1:IFJa2vI7gxF6fypOQXYmbuFwKLsde4zVwcv1p9zhOqY= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.12/go.mod h1:tYkAIta/gxgbBZ/PIzFxSH5blajgX4D00RpQqCG/GZs= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.11.0/go.mod h1:UFNHzrfcEo/ZCmA5SveVqxh0l57BP27HCvroN5o59FI= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.22.1/go.mod h1:+AYF4e9kqQhra0AfKPoOOIUK0Ho7BquOWQK+Te+Qnns= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.12/go.mod h1:dQlDAFtTwsZi3UI+03NVF4XQoarx0VU5/IKMLyVyC2E= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.8.7/go.mod h1:4ADQGbgAAvEDn/2I6XLeBN6mCUq6D44bfjWaqQc6iYU= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.12/go.mod h1:Fb6yZsMdgFUo3wdDc7vK75KmBzXkY1Tio/053vuvCXU= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v1.2.1/go.mod h1:OE5z8qJdTiPpSeWunFenN/RMF7ymRgI0HvJ/c7Zl5U0= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.12/go.mod h1:Bt9j9aqlNDj1xW5uMNrHyhpc61JZgttbQRecG9xm1cE= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.12/go.mod h1:YaAgE2xKzIN8yQNUspTTeZbvdcifSJh+wcMyXmp8fgg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.12/go.mod h1:9WFCBNpS0EIIhQaqiNC3ezZ48qisGPh3Ekz6T2n9Ioc= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.12.11/go.mod h1:0cYsbMDyqr/1SbEt1DfN+S+mI2AAnVrT7+Hrh7qaxZ0= code.gitea.io/sdk/gitea v0.12.0/go.mod h1:z3uwDV/b9Ls47NGukYM9XhnHtqPh/J+t40lsUrR6JDY= contrib.go.opencensus.io/exporter/aws v0.0.0-20181029163544-2befc13012d0/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/ocagent v0.5.0/go.mod h1:ImxhfLRpxoYiSq891pBrLVhN+qmP8BTVvdH2YLs7Gl0= @@ -71,8 +750,12 @@ contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e contrib.go.opencensus.io/integrations/ocsql v0.1.4/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.apache.org/thrift.git v0.13.0 h1:/3bz5WZ+sqYArk7MBBBbDufMxKKOA56/6JO6psDpUDY= git.apache.org/thrift.git v0.13.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/Azure/azure-amqp-common-go/v2 v2.1.0/go.mod h1:R8rea+gJRuJR6QxTir/XuEd+YuKoUiazDC/N96FiDEU= github.com/Azure/azure-pipeline-go v0.2.1 h1:OLBdZJ3yvOn2MezlWvbrBMTEUQC72zAftRZOMdj5HYo= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= @@ -84,6 +767,22 @@ github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9mo github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v63.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2/go.mod h1:FbdwsQ2EzwvXxOPcMFYO8ogEc9uMMIj3YkmCdXdAFmk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.0.0/go.mod h1:lYq15QkJyEsNegz5EhI/0SXQ6spvGfgwBH/Qyzkoc/s= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0 h1:Be6KInmFEKV81c0pOAEbRYehLMwmmGI1exuFj248AMk= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0/go.mod h1:WCPBHsOXfBVnivScjs2ypRfimjEW0qPVLGgJkZlrIOA= github.com/Azure/azure-service-bus-go v0.9.1/go.mod h1:yzBx6/BUGfjfeqbRZny9AQIbIe3AcV9WZbAdpkoXOa0= github.com/Azure/azure-storage-blob-go v0.8.0 h1:53qhf0Oxa0nOjgbDeeYPUeyiNmafAFEY95rZLK0Tj6o= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= @@ -144,8 +843,13 @@ github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzU github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/P4ZwUYSdNCWsMEI0VeyrFoI2rAhJQ= github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/DataDog/datadog-agent/pkg/obfuscate v0.0.0-20211129110424-6491aa3bf583/go.mod h1:EP9f4GqaDJyP1F5jTNMtzdIpw3JpNs3rMSJOnYywCiw= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= @@ -157,15 +861,26 @@ github.com/DataDog/zstd v1.3.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t github.com/Djarvur/go-err113 v0.0.0-20200410182137-af658d038157/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/Djarvur/go-err113 v0.1.0/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20191009163259-e802c2cb94ae/go.mod h1:mjwGPas4yKduTyubHvD1Atl9r1rUq8DfVy+gkVvZ+oo= +github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/IBM/sarama v1.43.3 h1:Yj6L2IaNvb2mRBop39N7mmJAHBVY3dTPncr3qGVkxPA= +github.com/IBM/sarama v1.43.3/go.mod h1:FVIRaLrhK3Cla/9FfRF5X9Zua2KpS3SYIXxhac1H+FQ= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.0.3/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= 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= @@ -189,26 +904,52 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrU github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= +github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/participle v0.2.1 h1:4AVLj1viSGa4LG5HDXKXrm5xRx19SB/rS/skPQB1Grw= github.com/alecthomas/participle v0.2.1/go.mod h1:SW6HZGeZgSIpcUWX3fXpfZhuaWHnmoD5KCVaqSaNTkk= +github.com/alecthomas/participle v0.7.1 h1:2bN7reTw//5f0cugJcTOnY/NYZcWQOaajW+BwZB5xWs= +github.com/alecthomas/participle v0.7.1/go.mod h1:HfdmEuwvr12HXQN44HPWXR0lHmVolVYe4dyL6lQ3duY= +github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= +github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= +github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= 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/apache/thrift v0.15.0 h1:aGvdaR0v1t9XLgjtBYwxcBvBOTMqClzwE26CHOgjW1Y= github.com/apache/thrift v0.15.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI= +github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8= github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= @@ -222,6 +963,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= 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= @@ -231,6 +974,8 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l 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/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= @@ -249,18 +994,27 @@ github.com/aws/aws-sdk-go v1.30.27/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZve github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= +github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.44.9/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.0.0/go.mod h1:smfAbmpW+tcRVuNUjo3MOArSZmW72t62rkCzc2i0TWM= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2/config v1.0.0/go.mod h1:WysE/OpUgE37tjtmtJd8GXgT8s1euilE5XtUkRNUQ1w= github.com/aws/aws-sdk-go-v2/credentials v1.0.0/go.mod h1:/SvsiqBf509hG4Bddigr3NB12MIpfHhZapyBurJe8aY= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.0/go.mod h1:wpMHDCXvOXZxGCRSidyepa8uJHY4vaBGfY2/+oKU/Bc= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.0/go.mod h1:3jExOmpbjgPnz2FJaMOfbSk1heTkZ66aD3yNtVhnjvI= github.com/aws/aws-sdk-go-v2/service/sqs v1.0.0/go.mod h1:w5BclCU8ptTbagzXS/fHBr+vAyXUjggg/72qDIURKMk= github.com/aws/aws-sdk-go-v2/service/sts v1.0.0/go.mod h1:5f+cELGATgill5Pu3/vK3Ebuigstc+qYEHW5MvGWZO4= github.com/aws/smithy-go v1.0.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.11.0/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= github.com/bcicen/jstream v0.0.0-20190220045926-16c1f8af81c2 h1:M+TYzBcNIRyzPRg66ndEqUMd7oWDmhvdQmaPC6EZNwM= github.com/bcicen/jstream v0.0.0-20190220045926-16c1f8af81c2/go.mod h1:RDu/qcrnpEdJC/p8tx34+YBFqqX71lB7dOX9QE+ZC4M= github.com/bcicen/jstream v1.0.1 h1:BXY7Cu4rdmc0rhyTVyT3UkxAiX3bnLpKLas9btbH5ck= @@ -269,8 +1023,11 @@ github.com/beevik/ntp v0.2.0 h1:sGsd+kAXzT0bfVfzJfce04g+dSRfrs+tbQW8lweuYgw= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= github.com/beevik/ntp v0.3.0 h1:xzVrPrE4ziasFXgBVBZJDP0Wg/KpMwk2KHJ4Ba8GrDw= github.com/beevik/ntp v0.3.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/beevik/ntp v1.4.3 h1:PlbTvE5NNy4QHmA4Mg57n7mcFTmr1W1j3gcK7L1lqho= +github.com/beevik/ntp v1.4.3/go.mod h1:Unr8Zg+2dRn7d8bHFuehIMSvvUYssHMxW3Q5Nx4RW5Q= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -294,6 +1051,8 @@ github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTK github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg= github.com/bombsimon/wsl/v3 v3.0.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/briandowns/spinner v1.18.1 h1:yhQmQtM1zsqFsouh09Bk/jCjd50pC3EOGsh28gLVvwY= github.com/briandowns/spinner v1.18.1/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= @@ -302,11 +1061,16 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2 github.com/caarlos0/ctrlc v1.0.0/go.mod h1:CdXpj4rmq0q/1Eb44M9zi2nKB0QraNKuRGYGrrHhcQw= github.com/campoy/unique v0.0.0-20180121183637-88950e537e7e/go.mod h1:9IOqJGCPMSc6E5ydlp5NIonxObaeu/Iub/X03EKPVYo= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cavaliercoder/go-cpio v0.0.0-20180626203310-925f9528c45e/go.mod h1:oDpT4efm8tSYHXV5tHSdRvBet/b/QzxZ+XyyPehvm3A= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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= @@ -315,40 +1079,71 @@ github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+ 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/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbles v0.10.0/go.mod h1:4tiDrWzH1MTD4t5NnrcthaedmI3MxU0FIutax7//dvk= github.com/charmbracelet/bubbles v0.10.3 h1:fKarbRaObLn/DCsZO4Y3vKCwRUzynQD9L+gGev1E/ho= github.com/charmbracelet/bubbles v0.10.3/go.mod h1:jOA+DUF1rjZm7gZHcNyIVW+YrBPALKfpGVdJu8UiJsA= +github.com/charmbracelet/bubbles v0.19.0 h1:gKZkKXPP6GlDk6EcfujDK19PCQqRjaJZQ7QRERx1UF0= +github.com/charmbracelet/bubbles v0.19.0/go.mod h1:WILteEqZ+krG5c3ntGEMeG99nCupcuIk7V0/zOP0tOA= github.com/charmbracelet/bubbletea v0.19.3/go.mod h1:VuXF2pToRxDUHcBUcPmCRUHRvFATM4Ckb/ql1rBl3KA= github.com/charmbracelet/bubbletea v0.20.0 h1:/b8LEPgCbNr7WWZ2LuE/BV1/r4t5PyYJtDb+J3vpwxc= github.com/charmbracelet/bubbletea v0.20.0/go.mod h1:zpkze1Rioo4rJELjRyGlm9T2YNou1Fm4LIJQSa5QMEM= +github.com/charmbracelet/bubbletea v0.27.1 h1:/yhaJKX52pxG4jZVKCNWj/oq0QouPdXycriDRA6m6r8= +github.com/charmbracelet/bubbletea v0.27.1/go.mod h1:xc4gm5yv+7tbniEvQ0naiG9P3fzYhk16cTgDZQQW6YE= github.com/charmbracelet/harmonica v0.1.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= +github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= github.com/charmbracelet/lipgloss v0.3.0/go.mod h1:VkhdBS2eNAmRkTwRKLJCFhCOVkjntMusBDxv7TXahuk= github.com/charmbracelet/lipgloss v0.4.0/go.mod h1:vmdkHvce7UzX6xkyf4cca8WlwdQ5RQr8fzta+xl7BOM= github.com/charmbracelet/lipgloss v0.4.1-0.20220204041308-bf2912e703f6/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs= github.com/charmbracelet/lipgloss v0.5.0 h1:lulQHuVeodSgDez+3rGiuxlPVXSnhth442DATR2/8t8= github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs= +github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw= +github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY= +github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY= +github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/exp/golden v0.0.0-20240815200342-61de596daa2b/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/charmbracelet/x/input v0.1.3/go.mod h1:1gaCOyw1KI9e2j00j/BBZ4ErzRZqa05w0Ghn83yIhKU= +github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0= +github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0= +github.com/charmbracelet/x/windows v0.1.2/go.mod h1:GLEO/l+lizvFDBPLIOk+49gdX49L9YWMB5t+DZd0jkQ= github.com/cheggaaa/pb v1.0.28 h1:kWGpdAcSp3MxMU9CCHOwz/8V0kCHN4+9yQm2MzWuI98= github.com/cheggaaa/pb v1.0.28/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/cheggaaa/pb/v3 v3.0.5/go.mod h1:X1L61/+36nz9bjIsrDU52qHKOQukUQe2Ge+YvGuquCw= github.com/cheggaaa/pb/v3 v3.0.8/go.mod h1:UICbiLec/XO6Hw6k+BHEtHeQFzzBH4i2/qk/ow1EJTA= +github.com/cheggaaa/pb/v3 v3.1.5/go.mod h1:CrxkeghYTXi1lQBEI7jSn+3svI3cuc19haAj6jM60XI= +github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmtGzzhLsnLs= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs= 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/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= 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= @@ -360,10 +1155,13 @@ github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIA github.com/colinmarc/hdfs/v2 v2.2.0 h1:4AaIlTq+/sWmeqYhI0dX8bD4YrMQM990tRjm636FkGM= github.com/colinmarc/hdfs/v2 v2.2.0/go.mod h1:Wss6n3mtaZyRwWaqtSH+6ge01qT0rw9dJJmvoUnIQ/E= github.com/confluentinc/confluent-kafka-go v1.4.0/go.mod h1:u2zNLny2xq+5rWeTQjFHbDzzNuba4P1vo31r9r4uAdg= +github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/coredns/caddy v1.1.1/go.mod h1:A6ntJQlAWuQfFlsd9hvigKbo2WS0VUs2l1e2F+BawD4= github.com/coredns/coredns v1.4.0 h1:RubBkYmkByUqZWWkjRHvNLnUHgkRVqAWgSMmRFvpE1A= github.com/coredns/coredns v1.4.0/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0= @@ -378,10 +1176,14 @@ github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= +github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM= 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 h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= @@ -394,6 +1196,8 @@ github.com/coreos/go-systemd/v22 v22.3.1 h1:7OO2CXWMYNDdaAzP51t4lCCZWwpQHmvPbm9s github.com/coreos/go-systemd/v22 v22.3.1/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -401,25 +1205,44 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbp github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosnicolaou/pbzip2 v1.0.1 h1:f5Ix000Rtl9tr0Ne33wNLtljGl2nAyR4ZirJrz9qg+0= github.com/cosnicolaou/pbzip2 v1.0.1/go.mod h1:cE04zhBMvwMrCLhsx6aLYh9cGsU9GyFB0oo/GmO+SkY= +github.com/cosnicolaou/pbzip2 v1.0.3 h1:CebGEQSYOg9uFDfTgIXNDI3cuaQovlnBUcdB614dQws= +github.com/cosnicolaou/pbzip2 v1.0.3/go.mod h1:uCNfm0iE2wIKGRlLyq31M4toziFprNhEnvueGmh5u3M= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 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/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 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/dave/astrid v0.0.0-20170323122508-8c2895878b14/go.mod h1:Sth2QfxfATb/nW4EsrSi2KyJmbcniZ8TgTaji17D6ms= +github.com/dave/brenda v1.1.0/go.mod h1:4wCUr6gSlu5/1Tk7akE5X7UorwiQ8Rij0SKH3/BGMOM= +github.com/dave/courtney v0.3.0/go.mod h1:BAv3hA06AYfNUjfjQr+5gc6vxeBVOupLqrColj+QSD8= +github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= +github.com/dave/jennifer v1.6.0/go.mod h1:AxTG893FiZKqxy3FP1kL80VMshSMuz2G+EgvszgGRnk= +github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= +github.com/dave/patsy v0.0.0-20210517141501-957256f50cba/go.mod h1:qfR88CgEGLoiqDaE+xxDCi5QA5v4vUoW0UCX2Nd5Tlc= +github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dchest/siphash v1.2.1 h1:4cLinnzVJDKxTCl9B01807Yiy+W7ZzVHj/KIroQRvT4= github.com/dchest/siphash v1.2.1/go.mod h1:q+IRvb2gOSrUnYoPqHiyHXS0FOBBOdl6tONBlVnOnt4= +github.com/dchest/siphash v1.2.3 h1:QXwFc8cFOR2dSa/gE6o/HokBMWtLUaNDVd+22aKHeEA= +github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc= github.com/decred/dcrd/chaincfg/chainhash v1.0.2/go.mod h1:BpbrGgrPTr3YJYRN3Bm+D9NuaFd+zGyNeIKgrhCXK60= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v3 v3.0.0/go.mod h1:J70FGZSbzsjecRTiTzER+3f1KZLNaXkuv+yeFTKoxM8= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= @@ -427,33 +1250,45 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/djherbis/atime v1.0.0 h1:ySLvBAM0EvOGaX7TI4dAM5lWj+RdJUCKtGSEHN8SGBg= github.com/djherbis/atime v1.0.0/go.mod h1:5W+KBIuTwVGcqjIfaTwt+KSYX1o6uep8dtevevQP/f8= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/dnstap/golang-dnstap v0.4.0/go.mod h1:FqsSdH58NAmkAvKcpyxht7i4FoBjKu8E4JUPt8ipSUs= github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 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/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 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/dswarbrick/smart v0.0.0-20190505152634-909a45200d6d/go.mod h1:apXo4PA/BgBPrt66j0N45O2stlBTRowdip2igwcUWVc= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= +github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0 h1:1F8mhG9+aO5/xpdtFkW4SxOJB67ukuDC3t2y2qayIX0= @@ -462,18 +1297,24 @@ github.com/eclipse/paho.mqtt.golang v1.3.0 h1:MU79lqr3FKNKbSrGN7d7bNYqh8MwWW7Zcx github.com/eclipse/paho.mqtt.golang v1.3.0/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc= github.com/eclipse/paho.mqtt.golang v1.3.5 h1:sWtmgNxYM9P2sP+xEItMozsR3w0cqZFlqnNN1bdl41Y= github.com/eclipse/paho.mqtt.golang v1.3.5/go.mod h1:eTzb4gxwwyWpqBUHGQZ4ABAV7+Jgm1PklsYT/eo8Hcc= +github.com/eclipse/paho.mqtt.golang v1.5.0 h1:EH+bUVJNgttidWFkLLVKaQPGmkTUfQQqjOsyvMGvD6o= +github.com/eclipse/paho.mqtt.golang v1.5.0/go.mod h1:du/2qNQVqJf/Sqs4MEL77kR8QTqANF7XU7Fk0aOTAgk= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= github.com/elastic/go-elasticsearch/v7 v7.12.0 h1:j4tvcMrZJLp39L2NYvBb7f+lHKPqPHSL3nvB8+/DV+s= github.com/elastic/go-elasticsearch/v7 v7.12.0/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= github.com/elastic/go-elasticsearch/v7 v7.17.1 h1:49mHcHx7lpCL8cW1aioEwSEVKQF3s+Igi4Ye/QTWwmk= github.com/elastic/go-elasticsearch/v7 v7.17.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/elastic/go-elasticsearch/v7 v7.17.10 h1:TCQ8i4PmIJuBunvBS6bwT2ybzVFxxUhhltAs3Gyu1yo= +github.com/elastic/go-elasticsearch/v7 v7.17.10/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= 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/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 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= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -484,9 +1325,19 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m 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.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155/go.mod h1:5Wkq+JduFtdAXihLmeTJf+tRYIT4KBc2vPXDhwVo1pA= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= +github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -494,6 +1345,7 @@ github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.5.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= github.com/farsightsec/golang-framestream v0.3.0/go.mod h1:eNde4IQyEiA5br02AouhEHCu3p3UzrCdFR4LuQHklMI= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -505,18 +1357,28 @@ github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= github.com/fatih/color v1.12.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/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/fgprof v0.9.2 h1:tAMHtWMyl6E0BimjVbFt7fieU6FpjttsZN7j0wT5blc= github.com/felixge/fgprof v0.9.2/go.mod h1:+VNi+ZXtHIQ6wIw6bUT8nXQRefQflWECoFyRealT5sg= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= +github.com/felixge/fgprof v0.9.4 h1:ocDNwMFlnA0NU0zSB3I52xkO4sFXk80VK9lXjLClu88= +github.com/felixge/fgprof v0.9.4/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 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/fortytw2/leaktest v1.2.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= @@ -526,11 +1388,17 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/frankban/quicktest v1.12.1/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fraugster/parquet-go v0.10.0 h1:whX91AO3dkkOnbH9MqD53DZ3rISw+Tnnj5yiqXjSv9Q= github.com/fraugster/parquet-go v0.10.0/go.mod h1:asQOKX0K/j+F3Xyj87kw7gKrU3yXo9M2hb8STSQKIIw= +github.com/fraugster/parquet-go v0.12.0 h1:1slnC5y2VWEOUSlzbeXatM0BvSWcLUDsR/EcZsXXCZc= +github.com/fraugster/parquet-go v0.12.0/go.mod h1:dGzUxdNqXsAijatByVgbAWVPlFirnhknQbdazcUIjY0= 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/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/garyburd/redigo v1.6.3/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= @@ -551,19 +1419,36 @@ github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-asn1-ber/asn1-ber v1.5.7 h1:DTX+lbVTWaTw1hQ+PbZPlnDZPEIs0SS/GCZAl535dDk= +github.com/go-asn1-ber/asn1-ber v1.5.7/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-chi/chi v1.5.0/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g= github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 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-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-jose/go-jose/v3 v3.0.0/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= +github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E= +github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= 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/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-ldap/ldap v3.0.2+incompatible h1:kD5HQcAzlQ7yrhfn+h+MSABeAy/jAJhvIJ/QDllP44g= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-ldap/ldap/v3 v3.1.3/go.mod h1:3rbOH3jRS2u6jg2rJnKAMLE/xQyCKIveG2Sa/Cohzb8= @@ -572,21 +1457,30 @@ github.com/go-ldap/ldap/v3 v3.2.4 h1:PFavAq2xTgzo/loE8qNXcQaofAaqIpI4WgaLdv+1l3E github.com/go-ldap/ldap/v3 v3.2.4/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= github.com/go-ldap/ldap/v3 v3.4.3 h1:JCKUtJPIcyOuG7ctGabLKMgIlKnGumD/iGjuWeEruDI= github.com/go-ldap/ldap/v3 v3.4.3/go.mod h1:7LdHfVt6iIOESVEe3Bs4Jp2sHEKgDeduAhgM1/f9qmo= +github.com/go-ldap/ldap/v3 v3.4.8 h1:loKJyspcRezt2Q3ZRMq2p/0v8iOurlmeXDPw6fikSvQ= +github.com/go-ldap/ldap/v3 v3.4.8/go.mod h1:qS3Sjlu76eHfHGpUdWkAXQTw4beih+cHsco2jXlIXrk= github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= 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/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v0.3.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.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -594,6 +1488,8 @@ github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/analysis v0.21.2 h1:hXFrOYFHUAMQdu6zwAiKKJHJQ8kqZs1ux/ru1P1wLJU= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= @@ -601,6 +1497,8 @@ 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/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= @@ -608,6 +1506,8 @@ github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDB 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/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= @@ -617,6 +1517,8 @@ github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= @@ -624,11 +1526,15 @@ github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= 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/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/runtime v0.23.3 h1:/dxjx4KCOQI5ImBMz036F6v/DzZ2NUjSRvbLJs1rgoE= github.com/go-openapi/runtime v0.23.3/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= +github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= +github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= @@ -637,6 +1543,8 @@ github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= github.com/go-openapi/spec v0.20.5 h1:skHa8av4VnAtJU5zyAUXrrdK/NDiVX8lchbG+BfcdrE= github.com/go-openapi/spec v0.20.5/go.mod h1:QbfOSIVt3/sac+a1wzmKbbcLXm5NdZnyBZYtCijp43o= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= @@ -645,6 +1553,8 @@ github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+W 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/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= @@ -654,11 +1564,17 @@ github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/ github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-openapi/validate v0.21.0 h1:+Wqk39yKOhfpLqNLEC0/eViCkzM5FVXVqrvt526+wcI= github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pg/pg/v10 v10.0.0/go.mod h1:XHU1AkQW534GFuUdSiQ46+Xw6Ah+9+b8DlT4YwhiXL8= github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -668,6 +1584,7 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-redis/redis/v7 v7.1.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= github.com/go-redis/redis/v8 v8.0.0/go.mod h1:isLoQT/NFSP7V67lyvM9GmdvLdyZ7pEhsXvvyQtnQTo= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -675,10 +1592,13 @@ github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gG github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= @@ -696,6 +1616,7 @@ github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslW github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= @@ -721,9 +1642,21 @@ 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/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= +github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= github.com/goccy/go-json v0.4.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.4/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= +github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= github.com/gocql/gocql v0.0.0-20220224095938-0eacd3183625/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -731,6 +1664,7 @@ github.com/gofiber/fiber/v2 v2.11.0/go.mod h1:oZTLWqYnqpMMuF922SjGbsYZsdpE1MCfh4 github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= 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= @@ -741,6 +1675,7 @@ github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= 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 v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= @@ -748,9 +1683,16 @@ github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.1 h1:pC5DB52sCeK48Wlb9oPcdhnjkz1TKt1D/P7WKJ0kUcQ= github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= 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 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= @@ -792,6 +1734,9 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -823,14 +1768,20 @@ github.com/gomodule/redigo v1.8.3 h1:HR0kYDX2RJZvAup8CsiJwxB4dTCSC0AaUq6S4SiLwUc github.com/gomodule/redigo v1.8.3/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= github.com/gomodule/redigo v1.8.8 h1:f6cXq6RRfiyrOJEV7p3JhLDlmawGBVBBP1MggY8Mo4E= github.com/gomodule/redigo v1.8.8/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= +github.com/gomodule/redigo v1.9.2 h1:HrutZBLhSIU8abiSfW8pj8mPhOyMYjZT/wcA4/L9L9s= +github.com/gomodule/redigo v1.9.2/go.mod h1:KsU3hiK/Ay8U42qpaJk+kuNa3C+spxapWpM+ywhcgtw= github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.9.0/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w= github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= 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= @@ -845,9 +1796,13 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.1.2/go.mod h1:GPivBPgdAyd2SU+vf6EpsgOtWDuPqjW0hJZt4rNdTZ4= github.com/google/go-github/v28 v28.1.1/go.mod h1:bsqJWQX05omyWVmc00nEUql9mhQyv38lDZ8kPZcQVoM= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/go-replayers/grpcreplay v0.1.0/go.mod h1:8Ig2Idjpr6gifRd6pNVggX6TC1Zw6Jx74AKp7QNH2QE= github.com/google/go-replayers/httpreplay v0.1.0/go.mod h1:YKZViNhiGgqdBlUbI2MwGpq4pXxNmhJLPHQ7cv2b5no= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= @@ -859,6 +1814,8 @@ github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible/go.m github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -869,6 +1826,7 @@ github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210423192551-a2663126120b/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -877,8 +1835,13 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/rpmpack v0.0.0-20191226140753-aa36bfddb3a0/go.mod h1:RaTPr0KUf2K7fnZYLNDrr8rxAamWs3iNywJLtQ2AzBg= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= @@ -889,8 +1852,18 @@ github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/wire v0.3.0/go.mod h1:i1DMg/Lu8Sz5yYl25iOdmc5CT5qusaa+zmRWs16741s= github.com/google/wire v0.4.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= +github.com/googleapis/cloud-bigtable-clients-test v0.0.2/go.mod h1:mk3CrkrouRgtnhID6UZQDK3DrFFa7cYCAJcEmNsHYrY= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4 h1:hU4mGcQI4DaAYW+IbTun+2qEZVFxK0ySjQLTbS0VQKc= @@ -902,14 +1875,25 @@ 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/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= 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/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.2.4/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190328170749-bb2674552d8f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20220104163920-15ed2e8cf2bd/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= @@ -942,8 +1926,11 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= 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= @@ -955,16 +1942,25 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.9.2/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/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.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= github.com/hashicorp/consul/api v1.0.0/go.mod h1:mbFwfRxOTDHZpT3iUsMAFcLNoVm6Xbe1xZ6KiSm8FY0= 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.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk= github.com/hashicorp/consul/internal v0.1.0/go.mod h1:zi9bMZYbiPHyAjgBWo7kCUcy5l2NrTdrkVupCc7Oo6c= +github.com/hashicorp/consul/proto-public v0.6.2/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= 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/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= +github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= 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= @@ -981,6 +1977,8 @@ github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39 github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.1.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= @@ -999,6 +1997,7 @@ github.com/hashicorp/go-retryablehttp v0.5.4 h1:1BZvpawXoJCWX6pNtow9+rpEj+3itIlu github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1 h1:DMo4fmknnz0E0evoNYnV48RjWndOsmd6OW+09R3cEP8= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= @@ -1006,12 +2005,15 @@ github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR3 github.com/hashicorp/go-secure-stdlib/base62 v0.1.1/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw= github.com/hashicorp/go-secure-stdlib/mlock v0.1.1/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.6/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= github.com/hashicorp/go-secure-stdlib/password v0.1.1/go.mod h1:9hH302QllNwu1o2TGYtSk8I8kTAN0ca1EHpwhm5Mmzo= github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.1/go.mod h1:l8slYwnJA26yBz+ErHpp2IRCLr0vuOMGBORIz4rRiAs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -1019,9 +2021,12 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= @@ -1029,48 +2034,74 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= 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/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= 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.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.6/go.mod h1:5VDNHjqFMgEcclnwmkCnC99IPwxBmIsxwY8qn+Nl0H4= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/raft v1.1.1-0.20190703171940-f639636d18e0/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft v1.1.2/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft v1.2.0/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft v1.3.3/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= +github.com/hashicorp/raft v1.3.9/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.8.6/go.mod h1:P/AVgr4UHsUYqVHG1y9eFhz8S35pqhGhLZaDpfGKIMo= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/vault/api v1.0.4 h1:j08Or/wryXT4AcHj1oCbMd7IijXcKzYUGw59LGu9onU= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= github.com/hashicorp/vault/api v1.1.0/go.mod h1:R3Umvhlxi2TN7Ex2hzOowyeNb+SfbVWI973N+ctaFMk= github.com/hashicorp/vault/api v1.5.0/go.mod h1:LkMdrZnWNrFaQyYYazWVn7KshilfDidgVBq6YiTq/bM= +github.com/hashicorp/vault/api v1.10.0/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8= github.com/hashicorp/vault/sdk v0.1.13 h1:mOEPeOhT7jl0J4AMl1E705+BcmeRs1VmKNb9F0sMLy8= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= github.com/hashicorp/vault/sdk v0.1.14-0.20200519221838-e0cfd64bc267/go.mod h1:WX57W2PwkrOPQ6rVQk+dy5/htHIaB4aBM70EwKThu10= github.com/hashicorp/vault/sdk v0.4.1/go.mod h1:aZ3fNuL5VNydQk8GcLJ2TV8YCRVvyaakYkhZRoVuhj0= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/iancoleman/strcase v0.3.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-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= 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.9/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/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf h1:WfD7VjIE6z8dIvMsI4/s+1qr5EL+zoIGev1BQj1eoJ8= github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf/go.mod h1:hyb9oH7vZsitZCiBt0ZvifOrB+qc8PS5IiilCIb87rg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/infobloxopen/go-trees v0.0.0-20200715205103-96a057b8dfb9/go.mod h1:BaIJzjD2ZnHmx2acPF6XfGLPzNCMiBbMRqJr+8/8uRI= +github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -1127,6 +2158,7 @@ github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jarcoal/httpmock v1.0.5/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -1136,17 +2168,25 @@ github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03 h1:FUwcHNlEqkqLjL github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.1/go.mod h1:T1hnNppQsBtxW0tCHMHTkAt8n/sABdzZgZdoFrZaZNM= github.com/jcmturner/gokrb5/v8 v8.4.2 h1:6ZIM6b/JJN0X8UM43ZOM6Z4SJzla+a/u7scXFJzodkA= github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.2/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jedib0t/go-pretty/v6 v6.5.9 h1:ACteMBRrrmm1gMsXe9PSTOClQ63IXDUt03H5U+UV8OU= +github.com/jedib0t/go-pretty/v6 v6.5.9/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8SUOScs+v9/t0E= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= +github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s= github.com/jinzhu/gorm v1.9.1/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= @@ -1155,6 +2195,8 @@ github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/ github.com/jinzhu/now v1.1.3/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= +github.com/jlaffaye/ftp v0.0.0-20190624084859-c1312a7102bf/go.mod h1:lli8NYPQOFy3O++YmYbqVgOcQ1JPCwdOy+5zSjKJ9qY= +github.com/jmattheis/goverter v1.5.0/go.mod h1:iVIl/4qItWjWj2g3vjouGoYensJbRqDHpzlEVMHHFeY= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= @@ -1185,15 +2227,21 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ratelimit v1.0.2 h1:sRxmtRiajbvrcLQT7S+JbqU0ntsb9W2yhSdNN8tWfaI= +github.com/juju/ratelimit v1.0.2/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= github.com/julienschmidt/httprouter v1.1.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= 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/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -1220,6 +2268,9 @@ github.com/klauspost/compress v1.15.6 h1:6D9PcO8QWu0JyaQ2zUMmu16T1T+zjjEpP91guRs github.com/klauspost/compress v1.15.6/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.8 h1:JahtItbkWjf2jzm/T+qgMxkP9EMHsqEUA6vCMGmXvhA= github.com/klauspost/compress v1.15.8/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= +github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.2/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= @@ -1238,10 +2289,16 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.11/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.0.14 h1:QRqdp6bb9M9S5yyKeYteXKuoKE4p0tGlra81fKOpWH8= github.com/klauspost/cpuid/v2 v2.0.14/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/filepathx v1.1.1 h1:201zvAsL1PhZvmXTP+QLer3AavWrO3U1NILWpniHK4w= +github.com/klauspost/filepathx v1.1.1/go.mod h1:XWxdp8rEw4gupPBrxrV5Q57dL/71xj0OgV1gKt2zTfU= github.com/klauspost/pgzip v1.2.1 h1:oIPZROsWuPHpOdMVWLuJZXwgjhrW8r1yEX8UqMyeNHM= github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= +github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/readahead v1.3.1 h1:QqXNYvm+VvqYcbrRT4LojUciM0XrznFRIDrbHiJtu/0= github.com/klauspost/readahead v1.3.1/go.mod h1:AH9juHzNH7xqdqFHrMRSHeH2Ps+vFf+kblDqzPFiLJg= github.com/klauspost/readahead v1.4.0 h1:w4hQ3BpdLjBnRQkZyNi+nwdHU7eGP9buTexWK9lU7gY= @@ -1254,25 +2311,32 @@ github.com/klauspost/reedsolomon v1.9.11 h1:n2kipJFo+CPqg7fH988XJXjqEyj14RJ8BYj7 github.com/klauspost/reedsolomon v1.9.11/go.mod h1:nLvuzNvy1ZDNQW30IuMc2ZWCbiqrJgdLoUS2X8HAUVg= github.com/klauspost/reedsolomon v1.10.0 h1:MonMtg979rxSHjwtsla5dZLhreS0Lu42AyQ20bhjIGg= github.com/klauspost/reedsolomon v1.10.0/go.mod h1:qHMIzMkuZUWqIh8mS/GruPdo3u0qwX2jk/LH440ON7Y= +github.com/klauspost/reedsolomon v1.12.4 h1:5aDr3ZGoJbgu/8+j45KtUJxzYm8k08JGtB9Wx1VQ4OA= +github.com/klauspost/reedsolomon v1.12.4/go.mod h1:d3CzOMOt0JXGIFZm1StgkyF14EYr3xneR2rNWo7NcMU= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 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/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= github.com/labstack/echo/v4 v4.2.0/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lestrrat-go/backoff/v2 v2.0.7 h1:i2SeK33aOFJlUNJZzf2IpXRBvqBBnaGXfY5Xaop/GsE= github.com/lestrrat-go/backoff/v2 v2.0.7/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= @@ -1280,19 +2344,29 @@ github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/blackmagic v1.0.2 h1:Cg2gVSc9h7sz9NOByczrbUvLopQmXrfFx//N+AkAr5k= +github.com/lestrrat-go/blackmagic v1.0.2/go.mod h1:UrEqBzIR2U6CnzVyUtfM6oZNMt/7O7Vohk2J0OGSAtU= github.com/lestrrat-go/codegen v1.0.0/go.mod h1:JhJw6OQAuPEfVKUCLItpaVLumDGWQznd1VaXrBk9TdM= github.com/lestrrat-go/httpcc v1.0.0 h1:FszVC6cKfDvBKcJv646+lkh4GydQg2Z29scgUfkOpYc= github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/iter v1.0.2 h1:gMXo1q4c2pHmC3dn8LzRhJfP1ceCbgSiT9lUydIzltI= +github.com/lestrrat-go/iter v1.0.2/go.mod h1:Momfcq3AnRlRjI5b5O8/G5/BvpzrhoFTZcn06fEOPt4= github.com/lestrrat-go/jwx v1.2.0 h1:n08WEu8cJy3uzuQ39KWAOIhM4XfeozgaEGA8mTiioZ8= github.com/lestrrat-go/jwx v1.2.0/go.mod h1:Tg2uP7bpxEHUDtuWjap/PxroJ4okxGzkQznXiG+a5Dc= github.com/lestrrat-go/jwx v1.2.14/go.mod h1:3Q3Re8TaOcVTdpx4Tvz++OWmryDklihTDqrrwQiyS2A= github.com/lestrrat-go/jwx v1.2.19 h1:qxxLmAXNwZpTTvjc4PH21nT7I4wPK6lVv3lVNcZPnUk= github.com/lestrrat-go/jwx v1.2.19/go.mod h1:bWTBO7IHHVMtNunM8so9MT8wD+euEY1PzGEyCnuI2qM= +github.com/lestrrat-go/jwx v1.2.30 h1:VKIFrmjYn0z2J51iLPadqoHIVLzvWNa1kCsTqNDHYPA= +github.com/lestrrat-go/jwx v1.2.30/go.mod h1:vMxrwFhunGZ3qddmfmEm2+uced8MSI6QFWGTKygjSzQ= github.com/lestrrat-go/option v0.0.0-20210103042652-6f1ecfceda35/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lestrrat-go/option v1.0.1 h1:oAzP2fvZGQKWkvHa1/SAcFolBEca1oN+mQ7eooNBEYU= +github.com/lestrrat-go/option v1.0.1/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lestrrat-go/pdebug/v3 v3.0.1/go.mod h1:za+m+Ve24yCxTEhR59N7UlnJomWwCiIqbJRmKeiADU4= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -1308,17 +2382,30 @@ github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= 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.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= +github.com/lithammer/shortuuid/v4 v4.0.0 h1:QRbbVkfgNippHOS8PXDkti4NaWeyYfcBTHtw7k08o4c= +github.com/lithammer/shortuuid/v4 v4.0.0/go.mod h1:Zs8puNcrvf2rV9rTH51ZLLcj7ZXqQI3lv67aw4KiB1Y= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0= +github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= 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/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5 h1:0x4qcEHDpruK6ML/m/YSlFUUu0UpRD3I2PHsNCuGnyA= github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1350,6 +2437,8 @@ github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d h1:oNAwILwmgWKFpuU+dXvI6dl9jG2mAWAZLX3r9s0PPiw= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= @@ -1357,6 +2446,8 @@ github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb h1:hXqqXzQtJbENrs github.com/mattn/go-ieproxy v0.0.0-20190805055040-f9202b1cfdeb/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-ieproxy v0.0.12 h1:OZkUFJC3ESNZPQ+6LzC3VJIFSnreeFLQyqvBWtvfL2M= +github.com/mattn/go-ieproxy v0.0.12/go.mod h1:Vn+N61199DAnVeTgaF8eoB9PvLO8P3OBnG95ENh7B7c= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -1373,6 +2464,11 @@ github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1y github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 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-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= @@ -1383,15 +2479,23 @@ github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRC github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= 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/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -1402,22 +2506,38 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= 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/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/minio/argon2 v1.0.0 h1:cLB/fl0EeBqiDYhsIzIPTdLZhCykRrvdx3Eu3E5oqsE= github.com/minio/argon2 v1.0.0/go.mod h1:XtOGJ7MjwUJDPtCqqrisx5QwVB/jDx+adQHigJVsQHQ= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/cli v1.22.0 h1:VTQm7lmXm3quxO917X3p+el1l0Ca5X3S4PM2ruUYO68= github.com/minio/cli v1.22.0/go.mod h1:bYxnK0uS629N3Bq+AOZZ+6lwF77Sodk4+UL9vNuXhOY= +github.com/minio/cli v1.24.2 h1:J+fCUh9mhPLjN3Lj/YhklXvxj8mnyE/D6FpFduXJ2jg= +github.com/minio/cli v1.24.2/go.mod h1:bYxnK0uS629N3Bq+AOZZ+6lwF77Sodk4+UL9vNuXhOY= github.com/minio/colorjson v1.0.2 h1:Em3IM68MTm3h+Oxa0nxrV9VQqDgbxvC5iq5A+pqzDeI= github.com/minio/colorjson v1.0.2/go.mod h1:JWxcL2n8T8JVf+NY6awl6kn5nK49aAzHOeQEM33dL0k= +github.com/minio/colorjson v1.0.8 h1:AS6gEQ1dTRYHmC4xuoodPDRILHP/9Wz5wYUGDQfPLpg= +github.com/minio/colorjson v1.0.8/go.mod h1:wrs39G/4kqNlGjwqHvPlAnXuc2tlPszo6JKdSBCLN8w= github.com/minio/console v0.19.0 h1:GorxVfHaXBR8eKapVupRpvI53UB7/f5p/hf6NKI8dJ4= github.com/minio/console v0.19.0/go.mod h1:yfF8zcgJtD+KPPFHHD1PMpFbhMnQRY8C7jmsrHBdoRU= github.com/minio/console v0.19.1 h1:g8BbCnU4LIuKU8K4xhIAjbq3fidCrt5JDeEd5HjhsnM= github.com/minio/console v0.19.1/go.mod h1:1qeA/u15v0TE/uC27o/jVK6MCpGpK97avKxp+SKBsuI= +github.com/minio/console v1.7.1 h1:QsB0rdcLIqywtuHADoAv6UWQS7nQqjKo/dxKz6bPDw8= +github.com/minio/console v1.7.1/go.mod h1:hv9glXg8zSAn29PddPf5KAn5rl9GWIoZMIghadJEl90= github.com/minio/csvparser v1.0.0 h1:xJEHcYK8ZAjeW4hNV9Zu30u+/2o4UyPnYgyjWp8b7ZU= github.com/minio/csvparser v1.0.0/go.mod h1:lKXskSLzPgC5WQyzP7maKH7Sl1cqvANXo9YCto8zbtM= +github.com/minio/dnscache v0.1.1 h1:AMYLqomzskpORiUA1ciN9k7bZT1oB3YZN4cEIi88W5o= +github.com/minio/dnscache v0.1.1/go.mod h1:WCumm6offO4rQ/82oTCSoHnlhTmc81+vXgKpBtSYRbg= github.com/minio/dperf v0.4.2 h1:u2fcdXViX3+alZcEYSOh1crNbGtVU5drQ24lP3Xx6j8= github.com/minio/dperf v0.4.2/go.mod h1:mo7rPmlIl3Bgn8CrM0Yjeu3AL3xXVd7sH7Hpj4OGK1E= +github.com/minio/dperf v0.6.0 h1:sQD/KC79gPScpkWxwj7w/4VYpKKMOlKqCT1mqL1Ph74= +github.com/minio/dperf v0.6.0/go.mod h1:8/jrntfTM3ZiWrXkuFBUVduOftepa4eZcG09NxCS3Ic= github.com/minio/filepath v1.0.0 h1:fvkJu1+6X+ECRA6G3+JJETj4QeAYO9sV43I79H8ubDY= github.com/minio/filepath v1.0.0/go.mod h1:/nRZA2ldl5z6jT9/KQuvZcQlxZIMQoFFQPvEXx9T/Bw= github.com/minio/gokrb5/v7 v7.2.5 h1:GPnlzrvEol/uJHouCEQ382Gd+w4in5s4wCTQ4umDki8= @@ -1430,12 +2550,20 @@ github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/minio/kes v0.14.0 h1:plCGm4LwR++T1P1sXsJbyFRX54CE1WRuo9PAPj6MC3Q= github.com/minio/kes v0.14.0/go.mod h1:OUensXz2BpgMfiogslKxv7Anyx/wj+6bFC6qA7BQcfA= github.com/minio/kes v0.19.2 h1:0kdMAgLMSkiDA33k8pMHC7d6erDuseuLrZF+N3017SM= github.com/minio/kes v0.19.2/go.mod h1:X2fMkDbAkjbSKDGOQZvyPkHxoG7nuzP6R78Jw+TzXtM= github.com/minio/kes v0.20.0 h1:1tyC51Rr8zTregTESuT/QN/iebNMX7B9t7d3xLNMEpE= github.com/minio/kes v0.20.0/go.mod h1:3FW1BQkMGQW78yhy+69tUq5bdcf5rnXJizyeKB9a/tc= +github.com/minio/kes v0.23.0/go.mod h1:vvXVGcgu9mYLkbVWlEvFFl6bYR196RQlOU2Q+rHApl8= +github.com/minio/kes-go v0.2.1/go.mod h1:76xf7l41Wrh+IifisABXK2S8uZWYgWV1IGBKC3GdOJk= +github.com/minio/kms-go/kes v0.3.0 h1:SU8VGVM/Hk9w1OiSby3OatkcojooUqIdDHl6dtM6NkY= +github.com/minio/kms-go/kes v0.3.0/go.mod h1:w6DeVT878qEOU3nUrYVy1WOT5H1Ig9hbDIh698NYJKY= +github.com/minio/kms-go/kms v0.4.0 h1:cLPZceEp+05xHotVBaeFJrgL7JcXM4lBy6PU0idkE7I= +github.com/minio/kms-go/kms v0.4.0/go.mod h1:q12CehiIy2qgBnDKq6Q7wmPi2PHSyRVug5DKp0HAVeE= github.com/minio/lsync v1.0.1 h1:AVvILxA976xc27hstd1oR+X9PQG0sPSom1MNb1ImfUs= github.com/minio/lsync v1.0.1/go.mod h1:tCFzfo0dlvdGl70IT4IAK/5Wtgb0/BrTmo/jE8pArKA= github.com/minio/madmin-go v1.0.2 h1:ttwuuN6AopJNcikazBEwnXnw45BxQ74GZFqlJvcKOXc= @@ -1452,10 +2580,14 @@ github.com/minio/madmin-go v1.3.20 h1:XHlIdewxAEEd/poI43CPiSmHGgJplkbFKFXZ1vZ6zM github.com/minio/madmin-go v1.3.20/go.mod h1:ez87VmMtsxP7DRxjKJKD4RDNW+nhO2QF9KSzwxBDQ98= github.com/minio/madmin-go v1.4.3 h1:5/kBHjKTjYOQQHvyznu51weN5hJtFW67LB2VLz+hmzU= github.com/minio/madmin-go v1.4.3/go.mod h1:ez87VmMtsxP7DRxjKJKD4RDNW+nhO2QF9KSzwxBDQ98= +github.com/minio/madmin-go/v3 v3.0.70 h1:zrFCXLcV6PR74JC0yytK4Dk2qsaCV8kXQoPTvcusR2k= +github.com/minio/madmin-go/v3 v3.0.70/go.mod h1:TOTc96ZkMknNhl+ReO/V68bQfgRGfH+8iy7YaDzHdXA= github.com/minio/mc v0.0.0-20220512134321-aa60a8db1e4d h1:txmSSDiVFG69Hp/6Yjg5azKl96ObYL3pBQPW0i2uHIs= github.com/minio/mc v0.0.0-20220512134321-aa60a8db1e4d/go.mod h1:g9jrk4AQ3yLaxDJzb5D+ww6sGiDC0w1k88LUH5lDR7M= github.com/minio/mc v0.0.0-20220705180830-01b87ecc02ff h1:b5XHy2gDZ+B3xQFhegHdSsQQUp82y6pKowwBCgD7SBU= github.com/minio/mc v0.0.0-20220705180830-01b87ecc02ff/go.mod h1:z/hyvWFsn5ZLbSaJjr9TlCocFghHmhYuNrtpEpEIn48= +github.com/minio/mc v0.0.0-20240909075310-04c5116c9bdf h1:Cn1gRAcNMK9G+eVODrOxuGdVcbWbjrN26B94nfVU4Xk= +github.com/minio/mc v0.0.0-20240909075310-04c5116c9bdf/go.mod h1:Hh9MpphHGwUDB4BAUbWMF8BMfk3/6IzXcrHumrXTr0I= github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/md5-simd v1.1.1 h1:9ojcLbuZ4gXbB2sX53MKn8JUZ0sB/2wfwsEcRw+I08U= @@ -1481,6 +2613,9 @@ github.com/minio/minio v0.0.0-20220704210254-b311abed3176 h1:Xx1JRC5AjtGxOqXuI/6 github.com/minio/minio v0.0.0-20220704210254-b311abed3176/go.mod h1:1ZJB87MwUo2jrKDOlSjB6GArfZ0KlMqcsepa0ogMW78= github.com/minio/minio v0.0.0-20220720015624-ce8397f7d944 h1:U1BF4n5GQpD2L36CyU6rPehcqgos0VT6a+O4eS2XQRQ= github.com/minio/minio v0.0.0-20220720015624-ce8397f7d944/go.mod h1:Sprtcs2teyyESqT3Zt78AvFMgkvNm4Lv4bEeZnmvtEA= +github.com/minio/minio v0.0.0-20241014163537-3da7c9cce3de h1:y43E/9B5ID9BxK1kskPvh79j7bcFBTbhk1Kmqfll/vU= +github.com/minio/minio v0.0.0-20241014163537-3da7c9cce3de/go.mod h1:F8wOuhUPhHKmacrvLWgVJc8crr+Q8XYs/imRvss8bDQ= +github.com/minio/minio-go/v6 v6.0.46/go.mod h1:qD0lajrGW49lKZLtXKtCB4X/qkMf0a5tBvN2PaZg7Gg= github.com/minio/minio-go/v6 v6.0.53/go.mod h1:DIvC/IApeHX8q1BAMVCXSXwpmrmM+I+iBvhvztQorfI= github.com/minio/minio-go/v6 v6.0.56-0.20200522164946-44a5f2e3b76b h1:hY8tAl7MwUuUB9ZqVDXEnrIqCuEy3dfU1RH0cZ7gu+o= github.com/minio/minio-go/v6 v6.0.56-0.20200522164946-44a5f2e3b76b/go.mod h1:KQMM+/44DSlSGSQWSfRrAZ12FVMmpWNuX37i2AX0jfI= @@ -1500,6 +2635,10 @@ github.com/minio/minio-go/v7 v7.0.30 h1:Re+qlwA+LB3mgFGYbztVPzlEjKtGzRVV5Sk38np8 github.com/minio/minio-go/v7 v7.0.30/go.mod h1:/sjRKkKIA75CKh1iu8E3qBy7ktBmCCDGII0zbXGwbUk= github.com/minio/minio-go/v7 v7.0.31 h1:zsJ3qPDeU3bC5UMVi9HJ4ED0lyEzrNd3iQguglZS5FE= github.com/minio/minio-go/v7 v7.0.31/go.mod h1:/sjRKkKIA75CKh1iu8E3qBy7ktBmCCDGII0zbXGwbUk= +github.com/minio/minio-go/v7 v7.0.77 h1:GaGghJRg9nwDVlNbwYjSDJT1rqltQkBFDsypWX1v3Bw= +github.com/minio/minio-go/v7 v7.0.77/go.mod h1:AVM3IUN6WwKzmwBxVdjzhH8xq+f57JSbbvzqvUzR6eg= +github.com/minio/mux v1.9.0 h1:dWafQFyEfGhJvK6AwLOt83bIG5bxKxKJnKMCi0XAaoA= +github.com/minio/mux v1.9.0/go.mod h1:1pAare17ZRL5GpmNL+9YmqHoWnLmMZF9C/ioUCfy0BQ= github.com/minio/operator v0.0.0-20220414212219-ba4c097324b2/go.mod h1:4Bo6a+XrBFEfCiiEtB14bw8l/nT3hcvZQKrZGZu27mA= github.com/minio/parquet-go v0.0.0-20200414234858-838cfa8aae61 h1:pUSI/WKPdd77gcuoJkSzhJ4wdS8OMDOsOu99MtpXEQA= github.com/minio/parquet-go v0.0.0-20200414234858-838cfa8aae61/go.mod h1:4trzEJ7N1nBTd5Tt7OCZT5SEin+WiAXpdJ/WgPkESA8= @@ -1514,16 +2653,21 @@ github.com/minio/pkg v1.1.22/go.mod h1:z9PfmEI804KFkF6eY4LoGe8IDVvTCsYGVuaf58Dr0 github.com/minio/pkg v1.1.23/go.mod h1:z9PfmEI804KFkF6eY4LoGe8IDVvTCsYGVuaf58Dr0WI= github.com/minio/pkg v1.1.26 h1:a8x4sHNBxCiHEkxZ/0EBTLqvV3nMtM2G/A6lXNfXN3U= github.com/minio/pkg v1.1.26/go.mod h1:z9PfmEI804KFkF6eY4LoGe8IDVvTCsYGVuaf58Dr0WI= +github.com/minio/pkg/v3 v3.0.20 h1:iZSWNIXOpbVXkLhxbVQofIIJgDwh62FJf4O+ttMobLE= +github.com/minio/pkg/v3 v3.0.20/go.mod h1:LwYm9J2+ZMgnrVvnxxFKss1QCuY86X85ec6CQNv2a4k= github.com/minio/rpc v1.0.0 h1:tJCHyLfQF6k6HlMQFpKy2FO/7lc2WP8gLDGMZp18E70= github.com/minio/rpc v1.0.0/go.mod h1:b9xqF7J0xeMXr0cM4pnBlP7Te7PDsG5JrRxl5dG6Ldk= github.com/minio/selfupdate v0.3.1 h1:BWEFSNnrZVMUWXbXIgLDNDjbejkmpAmZvy/nCz1HlEs= github.com/minio/selfupdate v0.3.1/go.mod h1:b8ThJzzH7u2MkF6PcIra7KaXO9Khf6alWPvMSyTDCFM= github.com/minio/selfupdate v0.4.0 h1:A7t07pN4Ch1tBTIRStW0KhUVyykz+2muCqFsITQeEW8= github.com/minio/selfupdate v0.4.0/go.mod h1:mcDkzMgq8PRcpCRJo/NlPY7U45O5dfYl2Y0Rg7IustY= +github.com/minio/selfupdate v0.6.0 h1:i76PgT0K5xO9+hjzKcacQtO7+MjJ4JKA8Ak8XQ9DDwU= +github.com/minio/selfupdate v0.6.0/go.mod h1:bO02GTIPCMQFTEvE5h4DjYB58bCoZ35XLeBf0buTDdM= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/minio/simdjson-go v0.1.5-0.20200303142138-b17fe061ea37 h1:pDeao6M5AEd8hwTtGmE0pVKomlL56JFRa5SiXDZAuJE= github.com/minio/simdjson-go v0.1.5-0.20200303142138-b17fe061ea37/go.mod h1:oKURrZZEBtqObgJrSjN1Ln2n9MJj2icuBTkeJzZnvSI= github.com/minio/simdjson-go v0.1.5 h1:6T5mHh7r3kUvgwhmFWQAjoPV5Yt5oD/VPjAI9ViH1kM= @@ -1532,16 +2676,27 @@ github.com/minio/simdjson-go v0.2.1 h1:nxYlp4Qd0w2pwLlif00l5vTFL6PcNAKpyHq27/pag github.com/minio/simdjson-go v0.2.1/go.mod h1:JPUSkRykfSPS+AhO0YPA1h0l5vY7NqrF4zel2b12wxc= github.com/minio/simdjson-go v0.4.2 h1:+5rVznvslY/oLIGOO0M7y2g0D8DnFbFZyF2Nr+KT5nk= github.com/minio/simdjson-go v0.4.2/go.mod h1:w6ptSSCcUPtqAOOdDVywJkX+8CyYzCdjrTCir0l6BVg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= github.com/minio/sio v0.2.0 h1:NCRCFLx0r5pRbXf65LVNjxbCGZgNQvNFQkgX3XF4BoA= github.com/minio/sio v0.2.0/go.mod h1:nKM5GIWSrqbOZp0uhyj6M1iA0X6xQzSGtYSaTKSCut0= github.com/minio/sio v0.2.1 h1:NjzKiIMSMcHediVQR0AFVx2tp7Wxh9tKPfDI3kH7aHQ= github.com/minio/sio v0.2.1/go.mod h1:8b0yPp2avGThviy/+OCJBI6OMpvxoUuiLvE6F1lebhw= github.com/minio/sio v0.3.0 h1:syEFBewzOMOYVzSTFpp1MqpSZk8rUNbz8VIIc+PNzus= github.com/minio/sio v0.3.0/go.mod h1:8b0yPp2avGThviy/+OCJBI6OMpvxoUuiLvE6F1lebhw= +github.com/minio/sio v0.4.1 h1:EMe3YBC1nf+sRQia65Rutxi+Z554XPV0dt8BIBA+a/0= +github.com/minio/sio v0.4.1/go.mod h1:oBSjJeGbBdRMZZwna07sX9EFzZy+ywu5aofRiV1g79I= +github.com/minio/websocket v1.6.0 h1:CPvnQvNvlVaQmvw5gtJNyYQhg4+xRmrPNhBbv8BdpAE= +github.com/minio/websocket v1.6.0/go.mod h1:COH1CePZfHT9Ec1O7vZjTlX5uEPpyYnrifPNbu665DM= +github.com/minio/xxml v0.0.3 h1:ZIpPQpfyG5uZQnqqC0LZuWtPk/WT8G/qkxvO6jb7zMU= +github.com/minio/xxml v0.0.3/go.mod h1:wcXErosl6IezQIMEWSK/LYC2VS7LJ1dAkgvuyIN3aH4= github.com/minio/zipindex v0.2.1 h1:A37vDQJ7Uyp4RHpQEEpintgiIxg0t3npH2CWjLT//u4= github.com/minio/zipindex v0.2.1/go.mod h1:s+b/Qyw9JtSEnYfaM4ASOWNO2xGnXCfzQ+SWAzVkVZc= +github.com/minio/zipindex v0.3.1 h1:8tXE3Nsg6q7jgJT2ceTI+zk7ofGS0rGB5oFbJagGPAo= +github.com/minio/zipindex v0.3.1/go.mod h1:nHL0vS1G4usAkVUS2JvV3udclhiJ29hqsb7vdZthsAo= 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/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -1549,8 +2704,10 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -1563,13 +2720,17 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.4.2/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/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/avo v0.0.0-20200303042253-6df701fe672f/go.mod h1:L0u9qfRMLNBO97u6pPukRp6ncoQz0Q25W69fvtht3vA= github.com/mmcloughlin/avo v0.0.0-20200803215136-443f81d77104/go.mod h1:wqKykBG2QzQDJEzvRkcS8x6MiSJkF52hXZsXcjaB3ls= github.com/mmcloughlin/avo v0.0.0-20201105074841-5d2f697d268f/go.mod h1:6aKT4zZIrpGqB3RpFU14ByCSSyKY6LfJz4J/JJChHfI= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 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/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1579,17 +2740,24 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.5.0 h1:2EkzeTSqBB4V4bJwWrt5gIIrZmpJBcoIRGS2kWLgzmk= github.com/montanaflynn/stats v0.5.0/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 h1:kMlmsLSbjkikxQJ1IPwaM+7LJ9ltFu/fi8CRzvSnQmA= github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= @@ -1598,7 +2766,10 @@ github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtl github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 h1:QANkGiGr39l1EESqrE0gZw0/AJNYzIvoGLhIoVYtluI= github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= 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/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1612,19 +2783,25 @@ github.com/nats-io/jwt v0.3.2 h1:+RB5hMpXUUA2dfxuhBTEkMOrYmM+gKIZYS1KjSostMI= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/jwt v1.1.0 h1:+vOlgtM0ZsF46GbmUoadq0/2rChNS45gtxHEa3H1gqM= github.com/nats-io/jwt v1.1.0/go.mod h1:n3cvmLfBfnpV4JJRN7lRYCyZnw48ksGsbThGXEk4w9M= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= github.com/nats-io/jwt/v2 v2.2.1-0.20220113022732-58e87895b296/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= +github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= +github.com/nats-io/jwt/v2 v2.5.0/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= github.com/nats-io/nats-server v1.4.1/go.mod h1:c8f/fHd2B6Hgms3LtCaI7y6pC4WD1f4SUxcCud5vhBc= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= github.com/nats-io/nats-server/v2 v2.1.7/go.mod h1:rbRrRE/Iv93O/rUvZ9dh4NfT0Cm9HWjW/BqOWLGgYiE= github.com/nats-io/nats-server/v2 v2.1.9/go.mod h1:9qVyoewoYXzG1ME9ox0HwkkzyYvnlBDugfR4Gg/8uHU= github.com/nats-io/nats-server/v2 v2.7.2/go.mod h1:tckmrt0M6bVaDT3kmh9UrIq/CBOBBse+TpXQi5ldaa8= github.com/nats-io/nats-server/v2 v2.7.4/go.mod h1:1vZ2Nijh8tcyNe8BDVyTviCd9NYzRbubQYiEHsvOQWc= +github.com/nats-io/nats-server/v2 v2.8.2/go.mod h1:vIdpKz3OG+DCg4q/xVPdXHoztEyKDWRtykQ4N7hd7C4= +github.com/nats-io/nats-server/v2 v2.9.23/go.mod h1:wEjrEy9vnqIGE4Pqz4/c75v9Pmaq7My2IgFmnykc4C0= github.com/nats-io/nats-streaming-server v0.14.2/go.mod h1:RyqtDJZvMZO66YmyjIYdIvS69zu/wDAkyNWa8PIUa5c= github.com/nats-io/nats-streaming-server v0.18.0/go.mod h1:Y9Aiif2oANuoKazQrs4wXtF3jqt6p97ODQg68lR5TnY= github.com/nats-io/nats-streaming-server v0.19.0/go.mod h1:oqrRqpMg84aiPDyroTornjVWNYJKh+6ozh2Mgt8dslE= github.com/nats-io/nats-streaming-server v0.21.1/go.mod h1:2W8QfNVOtcFpmf0bRiwuLtRb0/hkX4NuOxPOFNOThVQ= github.com/nats-io/nats-streaming-server v0.21.2/go.mod h1:2W8QfNVOtcFpmf0bRiwuLtRb0/hkX4NuOxPOFNOThVQ= github.com/nats-io/nats-streaming-server v0.24.1/go.mod h1:N2Q05hKD+aW2Ur1VYP85yUR2zUWHbqJG88CxAFLRrd4= +github.com/nats-io/nats-streaming-server v0.24.6/go.mod h1:tdKXltY3XLeBJ21sHiZiaPl+j8sK3vcCKBWVyxeQs10= github.com/nats-io/nats.go v1.9.1 h1:ik3HbLhZ0YABLto7iX80pZLPw/6dx3T+++MZJwLnMrQ= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nats.go v1.10.0 h1:L8qnKaofSfNFbXg0C5F71LdjPRnmQwSsA4ukmkt1TvY= @@ -1633,8 +2810,13 @@ github.com/nats-io/nats.go v1.13.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/ github.com/nats-io/nats.go v1.13.1-0.20220121202836-972a071d373d/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nats.go v1.13.1-0.20220308171302-2f2f6968e98d h1:zJf4l8Kp67RIZhoVeniSLZs69SHNgjLHz0aNsqPPlx8= github.com/nats-io/nats.go v1.13.1-0.20220308171302-2f2f6968e98d/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nats.go v1.14.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nats.go v1.15.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nats.go v1.16.0 h1:zvLE7fGBQYW6MWaFaRdsgm9qT39PJDQoju+DS8KsO1g= github.com/nats-io/nats.go v1.16.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nats.go v1.22.1/go.mod h1:tLqubohF7t4z3du1QDPYJIQQyhb4wl6DhjxEajSI7UA= +github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= +github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3 h1:6JrEfig+HzTH85yxzhSVbjHRJv9cn0p6n3IngIcM5/k= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -1644,6 +2826,8 @@ github.com/nats-io/nkeys v0.2.0 h1:WXKF7diOaPU9cJdLD7nuzwasQy9vT1tBqzXZZf3AMJM= github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nats-io/stan.go v0.4.5 h1:lPZ9y1jVGiXcTaUc1SnEIWPYfh0avuEiHBePNJYgpPk= @@ -1654,6 +2838,8 @@ github.com/nats-io/stan.go v0.8.3 h1:XyemjL9vAeGHooHn5RQy+ngljd8AVSM2l65Jdnpv4rI github.com/nats-io/stan.go v0.8.3/go.mod h1:Ejm8bbHnMTSptU6uNMAVuxeapMJYBB/Ml3ej6z4GoSY= github.com/nats-io/stan.go v0.10.2 h1:gQLd05LhzmhFkHm3/qP/klYHfM/hys45GyHa1Uly/kI= github.com/nats-io/stan.go v0.10.2/go.mod h1:vo2ax8K2IxaR3JtEMLZRFKIdoK/3o1/PKueapB7ezX0= +github.com/nats-io/stan.go v0.10.4 h1:19GS/eD1SeQJaVkeM9EkvEYattnvnWrZ3wkSWSw4uXw= +github.com/nats-io/stan.go v0.10.4/go.mod h1:3XJXH8GagrGqajoO/9+HgPyKV5MWsv7S5ccdda+pc6k= github.com/navidys/tvxwidgets v0.1.0 h1:cY9pU5ww+hbpwMAYC2eTEX5tKF3KD/ku7gu/XMnSulk= github.com/navidys/tvxwidgets v0.1.0/go.mod h1:Cr8CTnbinH2X8bY/vwb8914mku3qImHQ8fmeqxwc9Cg= github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= @@ -1662,15 +2848,19 @@ github.com/ncw/directio v1.0.5/go.mod h1:rX/pKEYkOXBGOggmcyJeJGloCkleSvphPx2eV3t github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= github.com/nsqio/go-nsq v1.0.7 h1:O0pIZJYTf+x7cZBA0UMY8WxFG79lYTURmWzAAh48ljY= github.com/nsqio/go-nsq v1.0.7/go.mod h1:XP5zaUs3pqf+Q71EqUJs3HYfBIqfK6G83WQMdNN+Ito= github.com/nsqio/go-nsq v1.0.8 h1:3L2F8tNLlwXXlp2slDUrUWSBn2O3nMh8R1/KEDFTHPk= github.com/nsqio/go-nsq v1.0.8/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY= +github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE= +github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= 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= @@ -1690,8 +2880,10 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.1/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= 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= @@ -1702,11 +2894,16 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= 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= @@ -1716,12 +2913,16 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/oschwald/geoip2-golang v1.7.0/go.mod h1:mdI/C7iK7NVMcIDDtf4bCKMJ7r0o7UwGeCo9eiitCMQ= github.com/oschwald/maxminddb-golang v1.9.0/go.mod h1:TK+s/Z2oZq0rSl4PSeAEoP0bgm82Cp5HyvYbt8K3zLY= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= 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= @@ -1729,7 +2930,11 @@ github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAv github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= @@ -1738,7 +2943,13 @@ github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/philhofer/fwd v1.1.2-0.20210722190033-5c56ac6d0bb9 h1:6ob53CVz+ja2i7easAStApZJlh7sxyq3Cm7g1Di6iqA= github.com/philhofer/fwd v1.1.2-0.20210722190033-5c56ac6d0bb9/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1 h1:VGcrWe3yk6o+t7BdVNy5UDPWa4OZuDWtE1W1ZbS7Kyw= 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/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -1751,6 +2962,11 @@ github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= @@ -1758,10 +2974,17 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= +github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= github.com/pkg/xattr v0.4.4/go.mod h1:sBD3RAqlr8Q+RC3FutZcikpT8nyDrIEEBw2J744gVWs= github.com/pkg/xattr v0.4.5 h1:P5SvUc1T07cHLto76ESJ+/x5kexU7s9127iVoeEW/hs= github.com/pkg/xattr v0.4.5/go.mod h1:sBD3RAqlr8Q+RC3FutZcikpT8nyDrIEEBw2J744gVWs= +github.com/pkg/xattr v0.4.10 h1:Qe0mtiNFHQZ296vRgUjRCoPHPqH7VdTOrZx3g0T+pGA= +github.com/pkg/xattr v0.4.10/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1770,12 +2993,16 @@ github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXq github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.44.1/go.mod h1:3WYi4xqXxGGXWDdQIITnLNmuDzO5n6wYva9spVhR4fg= github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.46.0/go.mod h1:3WYi4xqXxGGXWDdQIITnLNmuDzO5n6wYva9spVhR4fg= github.com/prometheus-operator/prometheus-operator/pkg/client v0.46.0/go.mod h1:k4BrWlVQQsvBiTcDnKEMgyh/euRxyxgrHdur/ZX/sdA= +github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -1795,6 +3022,8 @@ github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVD 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_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg= +github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= 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 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= @@ -1804,6 +3033,9 @@ 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/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1819,11 +3051,17 @@ github.com/prometheus/common v0.14.0 h1:RHRyE8UocrbjU+6UvRzwi6HjiDfxrrBU91TtbKzk github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +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/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 v0.59.1 h1:LXb1quJHWm1P6wq/U824uxYi4Sg0oGvNeUm1z5dJoX0= +github.com/prometheus/common v0.59.1/go.mod h1:GpWM7dewqmVYcd7SmRaiWVe9SSqjf0UrwnYnpEZNuT0= +github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= +github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= +github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1839,12 +3077,22 @@ github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3x 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/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/prom2json v1.3.1 h1:OogL5hsrJpLPz3jZ4LPz4sJRTtADzViCNRQoqrzUQvk= github.com/prometheus/prom2json v1.3.1/go.mod h1:A8Oy9aiQx4wrJY9ya1i4nHOySGmkVp5EO0aU1iSJR+g= +github.com/prometheus/prom2json v1.4.0 h1:2AEOsd1ebqql/p9u0IWgCpUAteAAf9Lnf/SVyieqer4= +github.com/prometheus/prom2json v1.4.0/go.mod h1:DmcIMPspQD/fMyFCYti5qJJbuEnqDh3DGoooO0sgr4w= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= +github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k= github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= +github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= +github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190704165056-9c2d0518ed81 h1:zQTtDd7fQiF9e80lbl+ShnD9/5NSq5r1EhcS8955ECg= @@ -1854,14 +3102,20 @@ github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqn github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/tview v0.0.0-20211202162923-2a6de950f73b/go.mod h1:WIfMkQNY+oq/mWwtsjOYHIZBuwthioY2srOmljJkTnk= github.com/rivo/tview v0.0.0-20220216162559-96063d6082f3 h1:crs4rrYnQqsZpz/EtjezHGCu13e+3W9eqj0MzIYXir0= github.com/rivo/tview v0.0.0-20220216162559-96063d6082f3/go.mod h1:WIfMkQNY+oq/mWwtsjOYHIZBuwthioY2srOmljJkTnk= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.2 h1:MiTWrPj55mNDHEiIX5YUSKefw/+lCQVoAFmD6oQm5w8= github.com/rjeczalik/notify v0.9.2/go.mod h1:aErll2f0sUX9PXZnVNyeiObbmTlk5jnMoCa4QEjJeqM= +github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= +github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -1871,10 +3125,14 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.6.0 h1:G9tHG9lebljV9mfp9SNPDL36nCDxmo3zTlAf1YgvzmI= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 h1:Lt9DzQALzHoDwMBGJ6v8ObDPR0dzr2a6sXTB1Fq7IHs= github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= @@ -1882,22 +3140,36 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryancurrah/gomodguard v1.0.4/go.mod h1:9T/Cfuxs5StfsocWr4WzDL36HqnX0fVb9d5fSEaLhoE= github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM= 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/ryanuber/columnize v2.1.2+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/safchain/ethtool v0.4.1 h1:S6mEleTADqgynileXoiapt/nKnatyR6bmIHoF+h2ADo= +github.com/safchain/ethtool v0.4.1/go.mod h1:XLLnZmy4OCRTkksP/UiMjij96YmIsBfmBQcs7H6tA48= github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/sagikazarmark/crypt v0.19.0/go.mod h1:c6vimRziqqERhtSe0MhIvzE1w54FrCHtrXb5NH/ja78= +github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= +github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sassoftware/go-rpmutils v0.0.0-20190420191620-a8f1baeba37b/go.mod h1:am+Fp8Bt506lA3Rk3QCmSqmYmLMnPDhdDUcosQCAx+I= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -1928,7 +3200,12 @@ github.com/shirou/gopsutil/v3 v3.21.12/go.mod h1:BToYZVTlSVlfazpDDYFnsVZLaoRG+g8 github.com/shirou/gopsutil/v3 v3.22.2/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY= github.com/shirou/gopsutil/v3 v3.22.5 h1:atX36I/IXgFiB81687vSiBI5zrMsxcIBkP9cQMJQoJA= github.com/shirou/gopsutil/v3 v3.22.5/go.mod h1:so9G9VzeHt/hsd0YwqprnjHnfARAUktauykSbr+y2gA= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1936,6 +3213,7 @@ github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxr github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -1947,6 +3225,7 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v0.0.0-20190401211740-f487f9de1cd3/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= @@ -1961,6 +3240,7 @@ github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+z 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/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1968,16 +3248,23 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/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/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= 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/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1990,16 +3277,23 @@ github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfD github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94 h1:0ngsPmuP6XIjiFRNFYlvKwSr5zff2v+uPHaffZ6/M4k= 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/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 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/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/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= @@ -2008,7 +3302,17 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 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/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= @@ -2028,6 +3332,9 @@ github.com/tidwall/gjson v1.7.5/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w= github.com/tidwall/gjson v1.14.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.17.3 h1:bwWLZU7icoKRG+C+0PNwIKC6FCJO/Q3p2pZvuP0jN94= +github.com/tidwall/gjson v1.17.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/grect v0.1.0/go.mod h1:sa5O42oP6jWfTShL9ka6Sgmg3TgIK649veZe05B7+J8= github.com/tidwall/grect v0.1.4/go.mod h1:9FBsaYRaR0Tcy4UwefBX/UDcDcDy9V5jUcxHzv2jd5Q= github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= @@ -2044,11 +3351,14 @@ github.com/tidwall/pretty v1.1.0 h1:K3hMW5epkdAVwibsQEfR/7Zj0Qgt4DxtNumTq/VloO8= github.com/tidwall/pretty v1.1.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/rtred v0.1.2/go.mod h1:hd69WNXQ5RP9vHd7dqekAz+RIdtfBogmglkZSRxCHFQ= github.com/tidwall/sjson v1.0.4 h1:UcdIRXff12Lpnu3OLtZvnc03g4vH2suXDXhBwBqmzYg= github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y= github.com/tidwall/sjson v1.1.6 h1:8fDdlahON04OZBlTQCIatW8FstSFJz8oxidj5h0rmSQ= github.com/tidwall/sjson v1.1.6/go.mod h1:KN3FZ7odvXIHPbJdhNorK/M9lWweVUbXsXXhrJ/kGOA= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tidwall/tinyqueue v0.1.1/go.mod h1:O/QNHwrnjqr6IHItYrzoHAKYhBkLI67Q096fQP5zMYw= github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= @@ -2064,6 +3374,8 @@ github.com/tinylib/msgp v1.1.6-0.20210521143832-0becd170c402/go.mod h1:75BAfg2ha github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw= github.com/tinylib/msgp v1.1.7-0.20211026165309-e818a1881b0e h1:P5tyWbssToKowBPTA1/EzqPXwrZNc8ZeNPdjgpcDEoI= github.com/tinylib/msgp v1.1.7-0.20211026165309-e818a1881b0e/go.mod h1:g7jEyb18KPe65d9RRhGw+ThaJr5duyBH8eaFgBUor7Y= +github.com/tinylib/msgp v1.2.2 h1:iHiBE1tJQwFI740SPEPkGE8cfhNfrqOYRlH450BnC/4= +github.com/tinylib/msgp v1.2.2/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= @@ -2076,11 +3388,15 @@ github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITn github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= +github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= 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= @@ -2102,6 +3418,8 @@ github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lP github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/unrolled/secure v1.10.0 h1:TBNP42z2AB+2pW9PR6vdbqhlQuv1iTeSVzK1qHjOBzA= github.com/unrolled/secure v1.10.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= +github.com/unrolled/secure v1.15.0 h1:q7x+pdp8jAHnbzxu6UheP8fRlG/rwYTb8TPuQ3rn9Og= +github.com/unrolled/secure v1.15.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= 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/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= @@ -2118,6 +3436,9 @@ github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOV github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vbauerster/mpb/v8 v8.8.2 h1:j9D/WmvKZw0BK1etRkw8lxVMKs4KO3TgdXsQWyEyPuc= +github.com/vbauerster/mpb/v8 v8.8.2/go.mod h1:JfCCrtcMsJwP6ZwMn9e5LMnNyp3TVNpUWWkN+nd4EWk= +github.com/vburenin/ifacemaker v1.2.1/go.mod h1:5WqrzX2aD7/hi+okBjcaEQJMg4lDGrpuEX3B8L4Wgrs= github.com/vdemeester/k8s-pkg-credentialprovider v1.17.4/go.mod h1:inCTmtUdr5KJbreVojo06krnTgaeAz/Z7lynpPk/Q2c= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vmihailenco/bufpool v0.1.11/go.mod h1:AFf/MOy3l2CFTKbxwt0mp2MwnqjNEs5H/UxrkA5jxTQ= @@ -2128,6 +3449,7 @@ github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgq github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= +github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc= github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= @@ -2138,13 +3460,23 @@ github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfD github.com/xanzy/go-gitlab v0.32.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= 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/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/scram v1.0.5 h1:TuS0RFmt5Is5qm9Tm2SoD89OPqe4IRiFtyFY4iwWXsw= +github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4= +github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yargevad/filepathx v1.0.0 h1:SYcT+N3tYGi+NvazubCNlvgIPbzAk7i7y2dwg3I5FYc= github.com/yargevad/filepathx v1.0.0/go.mod h1:BprfX/gpYNJHJfc35GjRRpVcwWXS89gGulUIU5tK3tA= @@ -2156,11 +3488,18 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.0 h1:6eLPZCVXpsGnhv8RiWBEJs5kenm2W1CMwon19/l8ODc= github.com/zeebo/xxh3 v1.0.0/go.mod h1:8VHV24/3AZLn3b6Mlp/KuC33LWH687Wq6EnziEB+rsA= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.einride.tech/aip v0.67.1/go.mod h1:ZGX4/zKw8dcgzdLsrvpOOGxfxI2QSk12SlP7d6c0/XI= 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= @@ -2177,19 +3516,27 @@ go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQc go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= +go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= go.etcd.io/etcd/client/pkg/v3 v3.5.0-beta.4 h1:IVvCfkch8truS86wSy67AbnXCYq8nYpM8NPTW14Ttp0= go.etcd.io/etcd/client/pkg/v3 v3.5.0-beta.4/go.mod h1:a+pbz+UrcOpvve1Qxf6tGovi15PjgtRhi0QTO2Nlc4U= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.4 h1:lrneYvz923dvC14R54XcA7FXoZ3mlGZAgmwhfm7HqOg= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= +go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E= go.etcd.io/etcd/client/v3 v3.5.0-beta.4 h1:AW/Sj3Oq7ZYjgNsYU0xad/tu3BH/Jnn2OuLvQoUNMEM= go.etcd.io/etcd/client/v3 v3.5.0-beta.4/go.mod h1:0L1RulN1QSXq6uKPMUSX+OTAYyFkapMK7iUHXXIH/1E= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/client/v3 v3.5.2/go.mod h1:kOOaWFFgHygyT0WlSmL8TJiXmMysO/nNUlEsSsN6W4o= go.etcd.io/etcd/client/v3 v3.5.4 h1:p83BUL3tAYS0OT/r0qglgc3M1JjhM0diV8DSWAhVXv4= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= +go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= 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= @@ -2204,6 +3551,8 @@ go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4x go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= go.mongodb.org/mongo-driver v1.8.4 h1:NruvZPPL0PBcRJKmbswoWSrmHeUvzdxA3GCPfD/NEOA= go.mongodb.org/mongo-driver v1.8.4/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= +go.mongodb.org/mongo-driver v1.16.1 h1:rIVLL3q0IHM39dvE+z2ulZLp9ENZKThVfuvN/IiN4l8= +go.mongodb.org/mongo-driver v1.16.1/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -2218,19 +3567,41 @@ go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= 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.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/collector/pdata v1.12.0/go.mod h1:MYeB0MmMAxeM0hstCFrCqWLzdyeYySim2dG6pDT6nYI= +go.opentelemetry.io/collector/semconv v0.105.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= 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.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= 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.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= 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/sdk/metric v1.24.0/go.mod h1:I6Y5FjH6rvEnTTAYQz3Mmv2kl6Ek5IIrmwTLqMrrOE0= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= 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 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= @@ -2241,10 +3612,14 @@ go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= 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/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2255,6 +3630,8 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -2271,7 +3648,11 @@ go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +goftp.io/server/v2 v2.0.1 h1:H+9UbCX2N206ePDSVNCjBftOKOgil6kQ5RAQNx5hJwE= +goftp.io/server/v2 v2.0.1/go.mod h1:7+H/EIq7tXdfo1Muu5p+l3oQ6rYkDZ8lY7IM5d5kVdQ= golang.org/x/arch v0.0.0-20190909030613-46d78d1859ac/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2308,6 +3689,7 @@ golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2333,22 +3715,36 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/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-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA= golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e h1:T8NU3HyQ8ClP4SEE+KbFlg6n0NhuTsN4MyznaarGsZM= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -2357,8 +3753,22 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200901203048-c4f52b2c50aa/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200908183739-ae8ad444f925/go.mod h1:1phAWC201xIgDyaFpmDeZkgf70Q4Pd/CNqfRtVPtxNw= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -2383,7 +3793,14 @@ golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hM golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2443,10 +3860,12 @@ golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201216054612-986b41b23924 h1:QsnDpLLOKwHBBDa8nDws4DYNc/ryVW2vCpxCs09d4PY= golang.org/x/net v0.0.0-20201216054612-986b41b23924/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= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210421230115-4e50805a0758 h1:aEpZnXcAmXkd6AvLb2OPt+EN1Zu/8Ne3pCqPjja5PXY= 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= @@ -2455,6 +3874,7 @@ golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qx 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-20210805182204-aaa1db679c0d/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-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2468,6 +3888,28 @@ golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220421235706-1d1ef9303861/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI= @@ -2489,11 +3931,24 @@ 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-20211005180243-6b3c2da341f1/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/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-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= +golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -2507,6 +3962,14 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ 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-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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= @@ -2601,6 +4064,9 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2610,6 +4076,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= 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= @@ -2621,6 +4088,7 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc 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-20210816074244-15123e1e1f71/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-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2639,11 +4107,38 @@ 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-20220325203850-36772127a21f/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-20220408201424-a24fb2fb8a0f/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-20220502124256-b6088ccd6cba h1:AyHWHCBVlIYI5rgEM3o+1PLd0sLPcIAoaUckGQMaWtw= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= 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-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2653,6 +4148,19 @@ golang.org/x/term v0.0.0-20210422114643-f5beecf764ed/go.mod h1:bj7SfCRtBDWHUb9sn 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/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= 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= @@ -2668,6 +4176,17 @@ golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= @@ -2683,6 +4202,12 @@ golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxb 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/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2728,6 +4253,7 @@ golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190914235951-31e00f45c22e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/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= @@ -2783,11 +4309,13 @@ golang.org/x/tools v0.0.0-20200929223013-bf155c11ec6f/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201105001634-bc3cf281b174/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/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= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -2798,6 +4326,13 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210820212750-d4cc65f0b2ff/go.mod h1:YD9qOF0M9xpSpdWTBbzEl5e/RnCefISl8E5Noe10jFM= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2806,11 +4341,23 @@ 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= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= 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.5.0 h1:lj9SyhMzyoa38fgFF0oO2T6pjs5IzkLPKfVtxpyCRMM= @@ -2849,6 +4396,7 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= @@ -2856,8 +4404,31 @@ 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/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0 h1:5ewPyCwP43C3i8B6C2Kb+eVAevbnke2xR8VbcSWjS4I= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.194.0 h1:dztZKG9HgtIpbI35FhfuSNR/zmaMVdxNlntHj1sIS4s= +google.golang.org/api v0.194.0/go.mod h1:AgvUFdojGANh3vI+P7EVnxj3AISHllxGCJSFmggmnd0= 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.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2868,6 +4439,7 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 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= @@ -2922,10 +4494,13 @@ google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6D 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= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -2943,6 +4518,8 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -2956,12 +4533,77 @@ google.golang.org/genproto v0.0.0-20220302033224-9aa15565e42a/go.mod h1:kGP+zUP2 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/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= 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-20220429170224-98d788798c3e h1:gMjH4zLGs9m+dGzR7qHCHaXMOwsJHJKKkHtyXhtOrJk= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c h1:TYOEhrQMrNDTAd2rX9m+WgGr8Ku6YNuj1D7OX6rWSok= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c/go.mod h1:2rC5OendXvZ8wGEo/cSLheztrZDZaSoHanUcd1xtZnw= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240814211410-ddb44dafa142/go.mod h1:gQizMG9jZ0L2ADJaM+JdZV4yTCON/CQpnHRPoM+54w4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -3001,11 +4643,25 @@ 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.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +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 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= +google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= 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= @@ -3026,6 +4682,11 @@ 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= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/DataDog/dd-trace-go.v1 v1.38.1/go.mod h1:GBhK4yaMJ1h329ivtKAqRNe1EZ944UnZwtz5lh7CnJc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d h1:TxyelI5cVkbREznMhfzycHdkp5cLA7DpE+GKjSslYhM= @@ -3057,6 +4718,7 @@ gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= gopkg.in/jcmturner/dnsutils.v1 v1.0.1 h1:cIuC1OLRGZrld+16ZJvvZxVJeKPsvd5eUIvxfoN5hSM= @@ -3087,6 +4749,7 @@ gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4 gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/telebot.v3 v3.2.1/go.mod h1:GJKwwWqp9nSkIVN51eRKU78aB5f5OnQuWdwiIZfPbko= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -3108,6 +4771,7 @@ 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= gorm.io/driver/postgres v1.0.0/go.mod h1:wtMFcOzmuA5QigNsgEIb7O5lhvH1tHAF1RbWmLWV4to= @@ -3118,6 +4782,7 @@ gorm.io/gorm v1.20.6/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= 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= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -3128,6 +4793,7 @@ 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= honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= k8s.io/api v0.17.4/go.mod h1:5qxx6vjmwUVG2nHQTKGlLts8Tbok8PzHl4vHtVFuZCA= k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA= @@ -3137,6 +4803,7 @@ k8s.io/api v0.20.2/go.mod h1:d7n6Ehyzx+S+cE3VhTGfVNNqtGc/oL9DCdYYahlurV8= k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg= k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8= k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I= +k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= k8s.io/apiextensions-apiserver v0.18.3/go.mod h1:TMsNGs7DYpMXd+8MOCX8KzPOCx8fnZMoIGB24m03+JE= k8s.io/apiextensions-apiserver v0.20.1/go.mod h1:ntnrZV+6a3dB504qwC5PN/Yg9PBiDNt1EVqbW2kORVk= k8s.io/apiextensions-apiserver v0.20.2/go.mod h1:F6TXp389Xntt+LUq3vw6HFOLttPa0V8821ogLGwb6Zs= @@ -3150,6 +4817,7 @@ k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRp k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc= k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= k8s.io/apiserver v0.17.4/go.mod h1:5ZDQ6Xr5MNBxyi3iUZXS84QOhZl+W7Oq2us/29c0j9I= k8s.io/apiserver v0.18.3/go.mod h1:tHQRmthRPLUtwqsOnJJMoI8SW3lnoReZeE861lH8vUw= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= @@ -3164,6 +4832,7 @@ k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= k8s.io/client-go v0.23.0/go.mod h1:hrDnpnK1mSr65lHHcUuIZIXDgEbzc7/683c6hyG4jTA= k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4= k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw= +k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= k8s.io/cloud-provider v0.17.4/go.mod h1:XEjKDzfD+b9MTLXQFlDGkk6Ho8SGMpaU8Uugx/KNK9U= k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= @@ -3182,6 +4851,8 @@ k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= @@ -3191,6 +4862,7 @@ k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= @@ -3198,6 +4870,7 @@ k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAG k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20220124234850-424119656bbf/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/legacy-cloud-providers v0.17.4/go.mod h1:FikRNoD64ECjkxO36gkDgJeiQWwyZTuBkhu+yxOc1Js= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= @@ -3207,14 +4880,58 @@ k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/ k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= maze.io/x/duration v0.0.0-20160924141736-faac084b6075 h1:4zVed9rL46683x3koxOYLzh8FlLFjnRrzTo2uvgA5D4= maze.io/x/duration v0.0.0-20160924141736-faac084b6075/go.mod h1:1kfR2ph3CIvtfIQ8D8JhmAgePmnAUnR+AWYWUBo+l08= mellium.im/sasl v0.2.1/go.mod h1:ROaEDLQNuf9vjKqE1SrAfnsobm2YKXT1gnN1uDp1PjQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= mvdan.cc/gofumpt v0.2.1/go.mod h1:a/rvZPhsNaedOJBzqRD9omnwVwHZsBdJirXHa9Gh9Ig= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= @@ -3232,6 +4949,7 @@ sigs.k8s.io/controller-runtime v0.8.0/go.mod h1:v9Lbj5oX443uR7GXYY46E0EE2o7k2YxQ sigs.k8s.io/controller-runtime v0.11.1/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eMbCQznLP5zcqA= sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= @@ -3241,6 +4959,7 @@ sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK 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.0/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/.bingo/prometheus.mod b/.bingo/prometheus.mod index 978e697b86..1245c03a83 100644 --- a/.bingo/prometheus.mod +++ b/.bingo/prometheus.mod @@ -1,10 +1,12 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT -go 1.14 +go 1.21.0 + +toolchain go1.23.1 replace k8s.io/klog => github.com/simonpasquier/klog-gokit v0.3.0 -replace k8s.io/klog/v2 => github.com/simonpasquier/klog-gokit/v3 v3.0.0 +replace k8s.io/klog/v2 => github.com/simonpasquier/klog-gokit/v3 v3.3.0 exclude github.com/linode/linodego v1.0.0 @@ -12,4 +14,4 @@ exclude github.com/grpc-ecosystem/grpc-gateway v1.14.7 exclude google.golang.org/api v0.30.0 -require github.com/prometheus/prometheus v0.37.0 // cmd/prometheus +require github.com/prometheus/prometheus v0.54.1 // cmd/prometheus diff --git a/.bingo/prometheus.sum b/.bingo/prometheus.sum index ba25439ed0..7410f02ee4 100644 --- a/.bingo/prometheus.sum +++ b/.bingo/prometheus.sum @@ -1,8 +1,10 @@ +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= 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= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -14,6 +16,7 @@ cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZ cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -25,15 +28,166 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0 h1:DAq3r8y4mDgyB/ZPJ9v/5VJNqjgJAxTn6ZYLlUywOu8= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= +cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.9/go.mod h1:teNI+P/xzZ3dppGXEYFvSmuOvmTjLE9toPq21WHssYc= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.9/go.mod h1:IXvQesVgOC7aXgK9OpYFn5eWnzz8fazegIiJ5WnCOVw= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.23.4/go.mod h1:1iTnQMOr6zRdkecW+gkxJpwV0Q/djEIII3YlXmyf7UY= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.9/go.mod h1:YE9XDTFwq859O6TpZNtatBMDWnMRZOiTVF+Ru3oCBeY= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.9/go.mod h1:tl53uGgVG1A00qK1dF6wGIji0CQIMrLdNccJ6+R221U= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.8.7/go.mod h1:Jge1HQaIkNU8JYSDY7l5SveeSKvGPvtLjzNjLU2+0N8= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.9/go.mod h1:sw8T321TAto/u6tMinv3AV63olGH/hw7RhG4ZgNhqFs= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.9/go.mod h1:epLvbmajRp919r1LGdvS1zgcHJt/1MTQJJ9+r0/NBQc= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.11/go.mod h1:ahyKXer42EOIddYzk2zYfvZnByGPdAYhXqBbRBsGizE= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.19.3/go.mod h1:1j8NNcHsbSE/KeHMZrizPIS6c8nm0WjEAPoFXzXNCj4= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.9/go.mod h1:uZ6+WHiT4iGn1iM1wk5njKnKJWiM3v/aYhDoCoHxs1w= +cloud.google.com/go/auth v0.7.0 h1:kf/x9B3WTbBUHkC+1VS8wwwli9TzhSt0vSTVBmMR8Ts= +cloud.google.com/go/auth v0.7.0/go.mod h1:D+WqdrpcjmiCgWrXmLLxOVq1GACoE36chW6KXoEvuIw= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.9/go.mod h1:KECCWW2AFsRuEVxUJEIXxcm3yPLf1rxS+qsBamyacMc= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.2.8/go.mod h1:Ai8ENs7ADMYWQ45DtfygUc6WblhShfi3kNPvuGv8/ok= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.9.0/go.mod h1:VhRaG/bX2EmeaPSHvtptP5OAhgYuTrvtTAulKM68oiI= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v1.0.8/go.mod h1:2WaEvUnw+1ZIUNu227h71X/Q8ypcWWowii9TQ4xlfo0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.61.0/go.mod h1:PjZUje0IocbuTOdq4DBOJLNYB0WF3pAKBHzAYyxCwFo= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.18.7/go.mod h1:RreCBJPmaN/lzCz/2Xl1hA+OzWGqrzDsax4Qjjp0CbA= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.8.5/go.mod h1:2npTMgNJPsmUg0jfmDDORuqBkTPEW6ZSTHXzfxTvN1M= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.8.3/go.mod h1:QS0jxTu5wgEbzaYgGs/GBYKvVgAgc9jnYaaTFH8jRtE= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.17.9/go.mod h1:h9emIJm+06sK1FxqC3etsWdG87tg92T24wimlJs6lhY= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.16.3/go.mod h1:KJYZAwTUaDKDdEHwLj/EmnpmwLkMuq+fGnBEHA1LlE4= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.7.8/go.mod h1:KQpBMxH99ZTPK4LgXkYUntzRQ5hcNkjpGRbNSRzW9Nk= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.12.10/go.mod h1:OHJzRAdE+7H00cdsINhb21ugVLDgk3Uh4r0holCB5XQ= 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= @@ -41,22 +195,552 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0 h1:v/k9Eueb8aAJ0vZuxKMrgm6kPhCLZU9HxFU+AFDs9Uk= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute v1.27.2 h1:5cE5hdrwJV/92ravlwIFRGnyH9CpLGhh4N0ZDVTU+BA= +cloud.google.com/go/compute v1.27.2/go.mod h1:YQuHkNEwP3bIz4LBYQqf4DIMfFtTDtnEgnwG0mJQQ9I= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.4.0 h1:vHzJCWaM4g8XIcm8kopr3XmDA4Gy/lblD3EhhSux05c= +cloud.google.com/go/compute/metadata v0.4.0/go.mod h1:SIQh1Kkb4ZJ8zJ874fqVkslA29PRXuleyj6vOzlbK7M= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.13.4/go.mod h1:6OWSyQxeaQRxhkyMhtE+RFOOlsMcKOTukv8nnjxbNCQ= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.37.2/go.mod h1:2ly7zpBmWtYjjuoB3fHyq8Gqrxaj2NIwzwVRpUcKYXk= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.11.8/go.mod h1:2ru4oxs6dCcaG3ZsmKAy4yMmG68ukOuS/IRCMEHYpLo= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.20.3/go.mod h1:AKC6vAy5urnMg5eJK3oUjy8oa5zMbiY33h125l8lmlo= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.9/go.mod h1:Wk/92E1BvhV7qs/dWb+3dN26uGgyp/H1Jr5ZJxeD3dw= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.9.6/go.mod h1:JKDPMfcYMu9oUMubIvvAGWTBX0sw4o/JIjCcczzbHmk= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.9/go.mod h1:ciYV8FL0JmrwgoJ7CH64oUHiI0oOf2VLE45LWKT51Ls= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.9/go.mod h1:61QutR66VZFgN8boHhl4/FTfxenNzihykv18BgxwSrg= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.18.0/go.mod h1:THLDVG07lcY1NgqVvjTV1mvec+rFHwpDwvSd+196MMc= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.5.1/go.mod h1:5s2CuQyTPX7e19ZRMLicfPFNgXrvsVct3xz94UvWFeQ= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.9/go.mod h1:wrw1SL/zLRlVgf0d8P0ZBJ2hhGaLbwoNRsW6m1mn64g= 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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.17.1/go.mod h1:mtzZ2HcVtz90OVrEXXGDc2pO4NM1kiBQy8YV4qGe0ZM= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.10.8/go.mod h1:6nkPjnk5Qr602Wq+YQ+/RWUOX5h4voMTz5abgEOYPCM= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.19.2/go.mod h1:i6zfU9FZkqFgWIvO2/gsodGU9qF4tF9mBgoMdfnf6as= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.54.2/go.mod h1:avkFNYog+U127jKpGzW1FOllBwZy3OfCz1K1eE9RGh8= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.14.2/go.mod h1:+uwRt+6wZ3PL0wsmZ1cUAj0Mt9kyeV3WcIKPW03wJVU= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.30.3/go.mod h1:aMxiOouLr36hyahLhI3OwAcsy7plOTiXR/RmK+MHbSg= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.9/go.mod h1:/ewEPIaNmTrElY7u9BZPcLPnoP1NJJXGvISDDapwVNU= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.2.3/go.mod h1:gMKe2JfE0OT0WuCJArzIndAmMWDPCIYGSWYIpJ6M7oM= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/errorreporting v0.3.1/go.mod h1:6xVQXU1UuntfAf+bVkFk6nld41+CPyF2NSPCyXE3Ztk= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.10/go.mod h1:wQlXvEb/0hB0C0d4H6/90P8CiZcYewkvJ3VoUVFPi4E= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.13.8/go.mod h1:Xq3SsMoOAn7RmacXgJO7kq818iRLFF0bVhH780qlmTs= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.8.5/go.mod h1:o8KvHyl5V30kIdrPX6hE+RknscXCUFXWSxYsEWeFfRU= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.16.4/go.mod h1:uDp5MbH0kCtXe3uBluq3Zi7bEDuHqcn60mAHxUsNezI= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.5.2/go.mod h1:ZuWJKacdXtjiO8ry9RrdT57gvcsU7c7/FTqqwjdNUjk= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.9/go.mod h1:gl758q5FLXewQZIsxQ7vHyYmLcGBuubvQO6J3yFDh08= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.9/go.mod h1:W2rDU2n2xgMpf3/BqpT6ffUX/I8yez87rrW/iGRz6Kk= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v1.2.2/go.mod h1:VMsMYDKpUVYNrhese31TVJMVXPLEtFT/AnIarqlcwVo= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.6/go.mod h1:to6ECAPgRO2xeqD8ISXHc70nObJuaKZThreQOjeOH3o= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.9/go.mod h1:qITZZoLzQhMQ6Re+izKEvz4C+M1AP13S+XuEpS26824= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.1.10/go.mod h1:iEgMq62sg8zx446GCaijmA2Miwg5o3UbO+nI47WHJps= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.9.8/go.mod h1:jQzSbtpYRbBoMdOINr/OqUxBY9rhyqLx04utTCmJ6oo= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.9/go.mod h1:1pL+mhlvtUNphwBSK91yO8NoTVQYwOpqim1anIVBwbM= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.9/go.mod h1:1fi6x4CexbygNgRPn+tcxCjOZFTl+4G6Adbo6sLPR7c= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.18.2/go.mod h1:YFz1LYrnGsXARuRePL729oINmN5J/5e7nYijgvfiIeY= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.12.7/go.mod h1:4s/11zABvI/gv+li/+ICe+cErIaN9hYmilf9wrc5Py0= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.9/go.mod h1:4c8eLVKz7/FPw6lvoHx2/JQX1rVM8+LlYmBp8h5H3MQ= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.10.0/go.mod h1:EHOwcxlltJrYGqMGfghSet736KR3hX1MAj614mrMk9I= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.5.9/go.mod h1:HD+0l9/OOW0za6UWdKJtXoFAX/BGg/3Wj8p10NeWF7c= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.9/go.mod h1:R7+78iH2j/SCTInutWINxGxEY0PH5rpbWt6uRq0Tn+Y= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.11.3/go.mod h1:4iKNrUzFISQ4RoiWCqIFEAAVtgKb2oQ09AVx8GheOUg= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.9/go.mod h1:3MjXTUsEzrMC9My6e9o7TOmgIUGlyrkVAxjzcmxBUdU= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.9/go.mod h1:06evGxt9E1Mf/tYsXJNdXuRj5qzspVd0Tt18kXYDD5c= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.13.8/go.mod h1:2uLJBAXn5EDYJx9r7mZtxZifCKpakZUCvNfzI7ejUiE= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.20.1/go.mod h1:FYSe/brgfuaXiEzOQFhTjsEsJv+WePyK71X7Y8qo6uQ= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.14.8/go.mod h1:QQ/XTMk7U5fzv1cVNUCQJEjpkVEE+nYOK7mg3hVTuiI= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.13.4/go.mod h1:dGTeJfDPQv0yGDt6gncj4XAPwxktjpCn5ZxQajStW8g= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.9/go.mod h1:aLS+6sLeZkMhLx9ntTMJG4qWHdvDPctqMOb6ggz9m5s= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.11.7/go.mod h1:lTjloYceMboZanBFC/JSZYet/K+JuO0mLAXVVhb/6bQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.6.7/go.mod h1:FREForRqqjTsJbElYyWSgb54WXUzTMTRyjVT+Tl80v8= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.9.4/go.mod h1:jk5hczI8Tciq+WCkN32GpjWJs67GSmAA0XHFUlELJLw= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.12.5/go.mod h1:f778/jOHKp6cP6NbbQgjy4SDfQf6BoVGiSWdxky3ONQ= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.13.0/go.mod h1:tlACnQi1rtSLnHRYzfw9SH9zXs0M7S1jqiW2EOCn2Y0= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.13.5/go.mod h1:V+QzBAbZBZJq9CmTyzKrh3rpMiWIr1OBn6RL4mMVWXI= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.9/go.mod h1:xNojFKIdq+hNGNpOZOEGVGA4Mdhm2yByMli2Ni/RV0w= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.10.7/go.mod h1:/JxxZOSCT8nASvH/SP4Bj81EnDFwZhFThG7mgVWIoPY= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.9/go.mod h1:attFfOEf8ECrCuCdT3WYY8wyMKRZt4iB1bEWYFzPn50= 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= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.40.0/go.mod h1:BVJI4sI2FyXp36KFKvFwcfDRDfR8MiLT8mMhmIhdAeA= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.14.0/go.mod h1:pwC/eCyXq37YV3NSaiJsfOmuoTDkzURnVKAWGSkjDUY= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.9/go.mod h1:QgE5f6s20QhCXf4UR9KMI/Q6Spykd2zEYXX2oBz6Cbs= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.12.5/go.mod h1:ggh5JNuG5ajpRqqcEkgni/DjpS7x12ktO+Edu8bmCJM= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.16.2/go.mod h1:bn/4nXSZkoH4QTXRjqWR2AZ0WA1b13ct354nul2SSiU= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.9/go.mod h1:vCBRKurJv+XVvRZ0XFhI/eBrBM7uBOPFjMEwSDMIflY= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.7.2/go.mod h1:mNdB5Wl9/oVr9Da3OrEstSyXCT949ignvO6ZrmYdmGU= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.17.2/go.mod h1:Ad6D8tkDZatI1X7szhhYWiatZmH6nSUfZ3WeCECyA0E= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.3.9/go.mod h1:Ep/xsiUt5ZOwNptGl1FBlHb+asAgqB+9RDJKBa/c1mI= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.10/go.mod h1:nOLkchaee8EY0g73hpv613pfnrZwn/dU2URYjJbRLR0= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.13.3/go.mod h1:e45+CxK0w6GaL4hS+KabgQskl4RdSS30b+HRf0TH0kk= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.17.2/go.mod h1:6eqX/AgDw56KwguEBfFNiNQ+Vzi+V6+GopklexYuJ0U= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.32.0/go.mod h1:s1dN6hM6HZyzUyJrqBoGvhxR/GecT5u48sidMIgDxTo= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.11.9/go.mod h1:qiDNuIS2qxuuroSmPNuXWxoFMvsEudKXP62Wos24BsU= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.9/go.mod h1:h3wVC6qaQ1nIlSWMasl1e/uwmepVbZpjSk/Bn7ZafSc= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.64.0/go.mod h1:TOFx3pb2UwPsDGlE1gTehW+y6YlU4IFk+VdDHSGQS/M= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.23.3/go.mod h1:u7tK/jxhzRZwZ5Nujhau7iLI3+VfJKYhpoZTjU7hRsE= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 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= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.8/go.mod h1:fEGWYffkV9OYOKms8nxyJWIZA7iEWPl2Mybk6bpQnEk= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.10/go.mod h1:q2/qIb2Eb2svmeBfkCGIia/NGmkcScdyYSyNNOgFRLI= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.9/go.mod h1:nuo7l7CVWUMvaTgswbn/hhn2Tv73/WbenqGyc236xpo= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.9/go.mod h1:6C7Ed7Le5Y1vWGR+8lQWsh/gmqK6l53lgji0YXBU40o= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.9/go.mod h1:vtWRnvEh+d8h2xljwxVwsdxxpoWZkxcNYnJF3FuJUV8= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.10.5/go.mod h1:n9fFca4U/EKr2GzJKrnQXemlYhfo1mT1nSt7Rt4l/VA= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.21.2/go.mod h1:UNXGQj3Hdyb70uaF9JeeM8Y8BAmAzLEMSWmyBKY2iVM= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.9/go.mod h1:Mv0dgb6U12BfBRPj39nM/7gcAFS1+VVGpTiyMJ/ShPo= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.8.4/go.mod h1:qlmeVbmCfPNuD1Kwa7/evqCJYoJ7WhiZ2XeVSYwiOaA= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.9/go.mod h1:x5LQyAESUXsI7/QAQY6BV8xEjIrlkGI+S+oau/Sb0Gs= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v1.1.5/go.mod h1:Js6QbSeC1OgpyygalCrMj90wa93O3kFgcs/u1YzCKsU= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.9/go.mod h1:Y0BlcnG9yTkoM6IL6auBeKvVEXL4LmNIxzscekrn/uk= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.9/go.mod h1:Wre67XdNQbt0LCBrvwVNBS5ORb8ssixq/u04CCZoO+k= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.9/go.mod h1:xrMxPiHB5iFxvc2tqbfUr6inPox6q6y7Wg0LTyZOKTw= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.12.8/go.mod h1:b7akG38W6lHmyPc+WYJxIYl1rEv79bBMYVwEZmp3aJQ= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= 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/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2/go.mod h1:FbdwsQ2EzwvXxOPcMFYO8ogEc9uMMIj3YkmCdXdAFmk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= 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= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= @@ -79,11 +763,26 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z 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= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8= +github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -94,6 +793,15 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX 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= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -102,13 +810,27 @@ 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/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= +github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= +github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= 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/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 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-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= 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= @@ -117,45 +839,73 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l 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/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/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.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.45 h1:E2i73X4QdVS0XrfX/aVPt/M0Su2IuJ7AFvAMtF0id1Q= github.com/aws/aws-sdk-go v1.44.45/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= +github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= 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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= 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/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= 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/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y= +github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs= 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/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -163,36 +913,68 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc h1:PYXxkRUBGUMa5xgMVMDl62vEklZvKpVaxQeN9ie7Hfk= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= +github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= 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-20180511133405-39ca1b05acc7 h1:u9SHYsPQNyt5tgDm3YN7+9dYrpK96E5wFilTFWIDZOM= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/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/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/dave/astrid v0.0.0-20170323122508-8c2895878b14/go.mod h1:Sth2QfxfATb/nW4EsrSi2KyJmbcniZ8TgTaji17D6ms= +github.com/dave/brenda v1.1.0/go.mod h1:4wCUr6gSlu5/1Tk7akE5X7UorwiQ8Rij0SKH3/BGMOM= +github.com/dave/courtney v0.3.0/go.mod h1:BAv3hA06AYfNUjfjQr+5gc6vxeBVOupLqrColj+QSD8= +github.com/dave/gopackages v0.0.0-20170318123100-46e7023ec56e/go.mod h1:i00+b/gKdIDIxuLDFob7ustLAVqhsZRk2qVZrArELGQ= +github.com/dave/jennifer v1.6.0/go.mod h1:AxTG893FiZKqxy3FP1kL80VMshSMuz2G+EgvszgGRnk= +github.com/dave/kerr v0.0.0-20170318121727-bc25dd6abe8e/go.mod h1:qZqlPyPvfsDJt+3wHJ1EvSXDuVjFTK0j2p/ca+gtsb8= +github.com/dave/patsy v0.0.0-20210517141501-957256f50cba/go.mod h1:qfR88CgEGLoiqDaE+xxDCi5QA5v4vUoW0UCX2Nd5Tlc= +github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.81.0 h1:sjb3fOfPfSlUQUK22E87BcI8Zx2qtnF7VUCCO4UK3C8= github.com/digitalocean/godo v1.81.0/go.mod h1:BPCqvwbjbGqxuUnIKB4EvS/AX7IDnNmt5fwvIkWo+ew= +github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= +github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= 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 v20.10.17+incompatible h1:JYCuMrWaVNophQTOrMMoSwudOVEfcegoZZrleKc1xwE= github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.0.3+incompatible h1:aBGI9TeQ4MPlhquTQKq9XbK79rKFVwXNUAYz9aXyEBE= +github.com/docker/docker v27.0.3+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-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 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/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 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/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= 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= @@ -203,6 +985,8 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkg 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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 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= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -215,28 +999,55 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3 h1:xdCVXxEe0Y3FQith+0cj2irwZudqGYvecuLB1HtdexY= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= +github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= 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/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= 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/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= 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/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 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= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 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/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= 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= @@ -244,62 +1055,96 @@ 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 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 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-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= 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-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 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/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 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= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= +github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= 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/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= 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/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= +github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= 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= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= +github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= 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/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= +github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= github.com/go-openapi/runtime v0.23.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= +github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= 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/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= +github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= 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/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= 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= github.com/go-openapi/swag v0.21.1 h1:wm0rhTb5z7qpJRHBdPOMuY4QjVUMbF6/kwoYeRAOrKU= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= +github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= github.com/go-openapi/validate v0.21.0 h1:+Wqk39yKOhfpLqNLEC0/eViCkzM5FVXVqrvt526+wcI= github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= +github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 h1:JVrqSeQfdhYRFk24TvhTZWU0q8lfCojxZQFi3Ou7+uY= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= +github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= @@ -324,19 +1169,33 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= 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-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= +github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= 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.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/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= @@ -370,6 +1229,9 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -378,8 +1240,12 @@ github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= 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/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= 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= @@ -395,6 +1261,10 @@ 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-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= 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= @@ -405,6 +1275,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -414,21 +1286,32 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 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-20220608213341-c488b8fa1db3/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk= +github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= 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= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0 h1:zO8WHNx/MYiAKJ3d5spxZXZE6KHmIQGQcAzwUzV7qQw= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 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= @@ -437,9 +1320,18 @@ 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/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= +github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gophercloud/gophercloud v0.25.0 h1:C3Oae7y0fUVQGSsBrb3zliAjdX+riCSEh4lNMejFNI4= github.com/gophercloud/gophercloud v0.25.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c= +github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= 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= @@ -448,8 +1340,12 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/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/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -459,14 +1355,27 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb 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/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +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/api v1.29.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw= +github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk= +github.com/hashicorp/consul/proto-public v0.6.2/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/cronexpr v1.1.1 h1:NJZDd87hGXjoZBdvyCF9mX4DCq5Wy7+A/w+A7q0wn6c= github.com/hashicorp/cronexpr v1.1.1/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= +github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= +github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= 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/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -475,57 +1384,95 @@ github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrj 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= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5bOTPYG5W3vf9+8= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 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= 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-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= 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= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 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/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +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= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/nomad/api v0.0.0-20220629141207-c2428e1673ec h1:jAF71e0KoaY2LJlRsRxxGz6MNQOG5gTBIc+rklxfNO0= github.com/hashicorp/nomad/api v0.0.0-20220629141207-c2428e1673ec/go.mod h1:jP79oXjopTyH6E8LF0CEMq67STgrlmBRIyijA0tuR5o= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= 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/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hetznercloud/hcloud-go v1.35.0 h1:sduXOrWM0/sJXwBty7EQd7+RXEJh5+CsAGQmHshChFg= github.com/hetznercloud/hcloud-go v1.35.0/go.mod h1:mepQwR6va27S3UQthaEPGS86jtzSY9xWL1e9dyxXpgA= +github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= +github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/iancoleman/strcase v0.3.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-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +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/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= 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/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/ionos-cloud/sdk-go/v6 v6.1.0 h1:0EZz5H+t6W23zHt6dgHYkKavr72/30O9nA97E3FZaS4= github.com/ionos-cloud/sdk-go/v6 v6.1.0/go.mod h1:Ox3W0iiEz0GHnfY9e5LmAxwklsxguuNFEUSu0gVRTME= +github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= +github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jmattheis/goverter v1.5.0/go.mod h1:iVIl/4qItWjWj2g3vjouGoYensJbRqDHpzlEVMHHFeY= 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= @@ -550,14 +1497,26 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= 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/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 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/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 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= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -567,17 +1526,25 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= 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.8.0 h1:7B2UaWu6C48tZZZrtINWRElAcwzk4TLnL9USjKf3xm0= github.com/linode/linodego v1.8.0/go.mod h1:heqhl91D8QTPVm2k9qZHP78zzbOdTFLXE9NJc3bcc50= +github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= +github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= 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.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -592,6 +1559,8 @@ github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -600,23 +1569,41 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 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-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= 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/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= 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.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= +github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= 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/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -625,6 +1612,11 @@ 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/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 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= @@ -636,6 +1628,7 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= 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= @@ -646,12 +1639,19 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= 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/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -666,17 +1666,23 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= 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.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= 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.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= 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= @@ -686,28 +1692,49 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= 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/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/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= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/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/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/alertmanager v0.27.0 h1:V6nTa2J5V4s8TG4C4HtrBP/WNSebCCTYGGv4qecA/+I= +github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= 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 v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -715,9 +1742,12 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD 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.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 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_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= 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= @@ -725,6 +1755,9 @@ 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/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= @@ -735,11 +1768,16 @@ github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= 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.7.1 h1:c6RXaK8xBVercEeUQ4tRNL8UGWzDHfvj9dseo1FcK1Y= github.com/prometheus/exporter-toolkit v0.7.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= +github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= +github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= 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.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -748,31 +1786,52 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O 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/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/prometheus v0.37.0 h1:LgnE+97wnUK/qcmk5oHIqieJEKwhZtaSidyKpUyeats= github.com/prometheus/prometheus v0.37.0/go.mod h1:egARUgz+K93zwqsVIAneFlLZefyGOON44WyAp4Xqbbk= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= 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= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= 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/ryanuber/columnize v2.1.2+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= 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/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= 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/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs= +github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/simonpasquier/klog-gokit v0.3.0 h1:TkFK21cbwDRS+CiystjqbAiq5ubJcVTk9hLUck5Ntcs= 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/simonpasquier/klog-gokit/v3 v3.3.0 h1:HMzH999kO5gEgJTaWWO+xjncW5oycspcsBnjn9b853Q= +github.com/simonpasquier/klog-gokit/v3 v3.3.0/go.mod h1:uSbnWC3T7kt1dQyY9sjv0Ao1SehMAJdVnUNSKhjaDsg= 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= @@ -781,6 +1840,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 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= @@ -789,19 +1850,30 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO 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/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= 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.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= 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/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 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= @@ -809,21 +1881,42 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 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/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 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/vburenin/ifacemaker v1.2.1/go.mod h1:5WqrzX2aD7/hi+okBjcaEQJMg4lDGrpuEX3B8L4Wgrs= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/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/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= 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/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= 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= @@ -831,12 +1924,22 @@ 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/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.einride.tech/aip v0.67.1/go.mod h1:ZGX4/zKw8dcgzdLsrvpOOGxfxI2QSk12SlP7d6c0/XI= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= 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.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= +go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= 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= @@ -847,41 +1950,80 @@ 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.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/collector/pdata v1.12.0 h1:Xx5VK1p4VO0md8MWm2icwC1MnJ7f8EimKItMWw46BmA= +go.opentelemetry.io/collector/pdata v1.12.0/go.mod h1:MYeB0MmMAxeM0hstCFrCqWLzdyeYySim2dG6pDT6nYI= +go.opentelemetry.io/collector/semconv v0.105.0 h1:8p6dZ3JfxFTjbY38d8xlQGB1TQ3nPUvs+D0RERniZ1g= +go.opentelemetry.io/collector/semconv v0.105.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= 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/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= 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 v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= 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.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 v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= 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/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= 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/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= 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/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= 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 v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= 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/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/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.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/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/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk= go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= +go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= 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/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= 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/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= 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= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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= @@ -893,28 +2035,59 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U 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-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/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-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/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/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88 h1:Tgea0cVUD0ivh5ADBX4WwuI12DUd2to3nCYe2eayMIw= golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= +golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -941,6 +2114,11 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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= @@ -981,6 +2159,7 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY 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-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= @@ -999,9 +2178,27 @@ 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/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= 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= @@ -1017,6 +2214,7 @@ 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-20211005180243-6b3c2da341f1/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/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= @@ -1025,6 +2223,16 @@ golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7Lm golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220628200809-02e64fa58f26 h1:uBgVQYJLi/m8M0wzp+aGwBWt90gMRoOVf+aWTW10QHI= golang.org/x/oauth2 v0.0.0-20220628200809-02e64fa58f26/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -1037,8 +2245,15 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/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/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 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= @@ -1047,6 +2262,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1099,11 +2315,14 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-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= @@ -1119,6 +2338,7 @@ golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/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-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1134,13 +2354,43 @@ golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8= golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= 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-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1151,17 +2401,36 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U= golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1181,6 +2450,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw 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-20190927191325-030b2cf1153e/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= @@ -1212,11 +2482,13 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY 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-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/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= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -1226,6 +2498,12 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= 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= @@ -1233,6 +2511,17 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= 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= @@ -1261,6 +2550,7 @@ google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6 google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= @@ -1268,11 +2558,32 @@ 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/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= google.golang.org/api v0.86.0 h1:ZAnyOHQFIuWso1BodVfSaRyffD74T9ERGFa3k1fNk/U= google.golang.org/api v0.86.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.188.0 h1:51y8fJ/b1AaaBRJr4yWm96fPcuxSo0JcegXE3DaHQHw= +google.golang.org/api v0.188.0/go.mod h1:VR0d+2SIiWOYG3r/jdm7adPW9hI2aRv9ETOSCQ9Beag= 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= @@ -1281,6 +2592,7 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= 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= @@ -1316,7 +2628,9 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D 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= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1338,6 +2652,8 @@ google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -1355,15 +2671,71 @@ google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX 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-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03 h1:W70HjnmXFJm+8RNjOpIDYW2nKsSi/af0VvIZUtYkwuU= google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20240708141625-4ad9e859172b h1:dSTjko30weBaMj3eERKc0ZVXW4GudCswM3m+P++ukU0= +google.golang.org/genproto v0.0.0-20240708141625-4ad9e859172b/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= +google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY= +google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240708141625-4ad9e859172b/go.mod h1:5/MT647Cn/GGhwTpXC7QqcaR5Cnee4v4MKCU1/nwnIQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240708141625-4ad9e859172b h1:04+jVzTs2XBnOZcPsLnmrTGqltqJbZQ1Ey26hjYdQQ0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240708141625-4ad9e859172b/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= 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= @@ -1379,6 +2751,7 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 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= @@ -1401,6 +2774,17 @@ google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu 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 v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= 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= @@ -1417,6 +2801,11 @@ 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= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= 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= @@ -1432,8 +2821,11 @@ 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.66.4 h1:SsAcf+mM7mRZo2nJNGt8mZCjG8ZRaNGMURJw7BsIST4= gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg= +gopkg.in/telebot.v3 v3.2.1/go.mod h1:GJKwwWqp9nSkIVN51eRKU78aB5f5OnQuWdwiIZfPbko= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -1454,6 +2846,7 @@ 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/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1462,26 +2855,87 @@ 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= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.24.2 h1:g518dPU/L7VRLxWfcadQn2OnsiGWVOadTLpdnqgY2OI= k8s.io/api v0.24.2/go.mod h1:AHqbSkTm6YrQ0ObxjO3Pmp/ubFF/KuM7jU+3khoBsOg= +k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= +k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= k8s.io/apimachinery v0.24.2 h1:5QlH9SL2C8KMcrNJPor+LbXVTaZRReml7svPEh4OKDM= k8s.io/apimachinery v0.24.2/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= k8s.io/client-go v0.24.2 h1:CoXFSf8if+bLEbinDqN9ePIDGzcLtqhfd6jpfnwGOFA= k8s.io/client-go v0.24.2/go.mod h1:zg4Xaoo+umDsfCWr4fCnmLEtQXyCNXCvJuSsglNcV30= +k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= +k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70/go.mod h1:VH3AT8AaQOqiGjMF9p0/IM1Dj+82ZwjfxUP1IxaHE+8= 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/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/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= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 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/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/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= 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/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= diff --git a/.bingo/shfmt.mod b/.bingo/shfmt.mod index d37d00521d..2a89453321 100644 --- a/.bingo/shfmt.mod +++ b/.bingo/shfmt.mod @@ -1,5 +1,7 @@ module _ // Auto generated by https://github.com/bwplotka/bingo. DO NOT EDIT -go 1.14 +go 1.21 -require mvdan.cc/sh/v3 v3.7.0 // cmd/shfmt +toolchain go1.22.5 + +require mvdan.cc/sh/v3 v3.8.0 // cmd/shfmt diff --git a/.bingo/shfmt.sum b/.bingo/shfmt.sum index fa65cc5474..45a2818e25 100644 --- a/.bingo/shfmt.sum +++ b/.bingo/shfmt.sum @@ -1,11 +1,14 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/renameio v1.0.1 h1:Lh/jXZmvZxb0BBeSY5VKEfidcbcbenKjZFzM/q0fSeU= @@ -29,22 +32,27 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867 h1:JoRuNIf+rpHl+VhScRQQvzbHed86tKkqwPMV34T8myw= @@ -57,6 +65,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20191110171634-ad39bd3f0407 h1:5zh5atpUEdIc478E/ebrIaHLKcfVvG6dL/fGv7BcMoM= golang.org/x/term v0.0.0-20191110171634-ad39bd3f0407/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -64,12 +74,16 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/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= @@ -82,9 +96,13 @@ mvdan.cc/editorconfig v0.1.1-0.20200121172147-e40951bde157 h1:VBYz8greWWP8BDpRX0 mvdan.cc/editorconfig v0.1.1-0.20200121172147-e40951bde157/go.mod h1:Ge4atmRUYqueGppvJ7JNrtqpqokoJEFxYbP0Z+WeKS8= mvdan.cc/editorconfig v0.2.0 h1:XL+7ys6ls/RKrkUNFQvEwIvNHh+JKx8Mj1pUV5wQxQE= mvdan.cc/editorconfig v0.2.0/go.mod h1:lvnnD3BNdBYkhq+B4uBuFFKatfp02eB6HixDvEz91C0= +mvdan.cc/editorconfig v0.2.1-0.20231228180347-1925077f8eb2 h1:8nmqQGVnHUtHuT+yvuA49lQK0y5il5IOr2PtCBkDI2M= +mvdan.cc/editorconfig v0.2.1-0.20231228180347-1925077f8eb2/go.mod h1:r8RiQJRtzrPrZdcdEs5VCMqvRxAzYDUu9a4S9z7fKh8= mvdan.cc/sh/v3 v3.1.2 h1:PG5BYlwtrkZTbJXUy25r0/q9shB5ObttCaknkOIB1XQ= mvdan.cc/sh/v3 v3.1.2/go.mod h1:F+Vm4ZxPJxDKExMLhvjuI50oPnedVXpfjNSrusiTOno= mvdan.cc/sh/v3 v3.5.1 h1:hmP3UOw4f+EYexsJjFxvU38+kn+V/s2CclXHanIBkmQ= mvdan.cc/sh/v3 v3.5.1/go.mod h1:1JcoyAKm1lZw/2bZje/iYKWicU/KMd0rsyJeKHnsK4E= mvdan.cc/sh/v3 v3.7.0 h1:lSTjdP/1xsddtaKfGg7Myu7DnlHItd3/M2tomOcNNBg= mvdan.cc/sh/v3 v3.7.0/go.mod h1:K2gwkaesF/D7av7Kxl0HbF5kGOd2ArupNTX3X44+8l8= +mvdan.cc/sh/v3 v3.8.0 h1:ZxuJipLZwr/HLbASonmXtcvvC9HXY9d2lXZHnKGjFc8= +mvdan.cc/sh/v3 v3.8.0/go.mod h1:w04623xkgBVo7/IUK89E0g8hBykgEpN0vgOj3RJr6MY= diff --git a/.bingo/variables.env b/.bingo/variables.env index 166f5b4455..c8cead57d2 100644 --- a/.bingo/variables.env +++ b/.bingo/variables.env @@ -1,4 +1,4 @@ -# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.8. DO NOT EDIT. +# Auto generated binary variables helper managed by https://github.com/bwplotka/bingo v0.9. DO NOT EDIT. # All tools are designed to be build inside $GOBIN. # Those variables will work only until 'bingo get' was invoked, or if tools were installed via Makefile's Variables.mk. GOBIN=${GOBIN:=$(go env GOBIN)} @@ -8,17 +8,19 @@ if [ -z "$GOBIN" ]; then fi -ALERTMANAGER="${GOBIN}/alertmanager-v0.24.0" +ALERTMANAGER="${GOBIN}/alertmanager-v0.27.0" -BINGO="${GOBIN}/bingo-v0.8.1-0.20230820182247-0568407746a2" +BINGO="${GOBIN}/bingo-v0.9.0" -FAILLINT="${GOBIN}/faillint-v1.11.0" +CAPNPC_GO="${GOBIN}/capnpc-go-v3.0.1-alpha.2.0.20240830165715-46ccd63a72af" -GOIMPORTS="${GOBIN}/goimports-v0.12.0" +FAILLINT="${GOBIN}/faillint-v1.13.0" + +GOIMPORTS="${GOBIN}/goimports-v0.23.0" GOJSONTOYAML="${GOBIN}/gojsontoyaml-v0.1.0" -GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.54.1" +GOLANGCI_LINT="${GOBIN}/golangci-lint-v1.61.0" GOTESPLIT="${GOBIN}/gotesplit-v0.2.1" @@ -34,11 +36,11 @@ JSONNETFMT="${GOBIN}/jsonnetfmt-v0.18.0" MDOX="${GOBIN}/mdox-v0.9.1-0.20220713110358-25b9abcf90a0" -MINIO="${GOBIN}/minio-v0.0.0-20220720015624-ce8397f7d944" +MINIO="${GOBIN}/minio-v0.0.0-20241014163537-3da7c9cce3de" PROMDOC="${GOBIN}/promdoc-v0.8.0" -PROMETHEUS="${GOBIN}/prometheus-v0.37.0" +PROMETHEUS="${GOBIN}/prometheus-v0.54.1" PROMTOOL="${GOBIN}/promtool-v0.47.0" @@ -46,5 +48,5 @@ PROMU="${GOBIN}/promu-v0.5.0" PROTOC_GEN_GOGOFAST="${GOBIN}/protoc-gen-gogofast-v1.3.2" -SHFMT="${GOBIN}/shfmt-v3.7.0" +SHFMT="${GOBIN}/shfmt-v3.8.0" diff --git a/.circleci/config.yml b/.circleci/config.yml index 92dc15e43f..9bc1c6cc1c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,56 +8,13 @@ orbs: executors: golang: docker: - - image: cimg/go:1.21-node + - image: cimg/go:1.23-node golang-test: docker: - - image: cimg/go:1.21-node + - image: cimg/go:1.23-node - image: quay.io/thanos/docker-swift-onlyone-authv2-keystone:v0.1 jobs: - test: - executor: golang-test - environment: - GO111MODULE: "on" - steps: - - git-shallow-clone/checkout - - go/load-cache - - go/mod-download - - run: - name: Download bingo modules - command: | - make install-tool-deps - - go/save-cache - - setup_remote_docker: - version: docker24 - - run: - name: Create Secret if PR is not forked - # GCS integration tests are run only for author's PR that have write access, because these tests - # require credentials. Env variables that sets up these tests will work only for these kind of PRs. - command: | - if ! [ -z ${GCP_PROJECT} ]; then - echo $GOOGLE_APPLICATION_CREDENTIALS_CONTENT > $GOOGLE_APPLICATION_CREDENTIALS - echo "Awesome! GCS and S3 AWS integration tests are enabled." - fi - - run: - name: "Run unit tests." - no_output_timeout: "30m" - environment: - THANOS_TEST_OBJSTORE_SKIP: GCS,S3,AZURE,COS,ALIYUNOSS,BOS,OCI,OBS - # Variables for Swift testing. - OS_AUTH_URL: http://127.0.0.1:5000/v2.0 - OS_PASSWORD: s3cr3t - OS_PROJECT_NAME: admin - OS_REGION_NAME: RegionOne - OS_USERNAME: admin - # taskset sets CPU affinity to 2 (current CPU limit). - command: | - if [ -z ${GCP_PROJECT} ]; then - export THANOS_TEST_OBJSTORE_SKIP=${THANOS_TEST_OBJSTORE_SKIP} - fi - echo "Skipping tests for object storages: ${THANOS_TEST_OBJSTORE_SKIP}" - taskset 2 make test - # Cross build is needed for publish_release but needs to be done outside of docker. cross_build: machine: true @@ -127,19 +84,11 @@ workflows: version: 2 thanos: jobs: - - test: - filters: - tags: - only: /.*/ - publish_main: - requires: - - test filters: branches: only: main - cross_build: - requires: - - test filters: tags: only: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/ @@ -147,7 +96,6 @@ workflows: ignore: /.*/ - publish_release: requires: - - test - cross_build filters: tags: diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index ce94ff9888..195e26a24c 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,9 +1,9 @@ # For details, see https://github.com/devcontainers/images/tree/main/src/go -FROM mcr.microsoft.com/devcontainers/go:1.21 +FROM mcr.microsoft.com/devcontainers/go:1.22 RUN echo "Downloading prometheus..." \ - && curl -sSL -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/prometheus/prometheus/tags" -o /tmp/tags.json \ - && VERSION_LIST="$(jq -r '.[] | select(.name | contains("rc") | not) | .name | split("v") | .[1]' /tmp/tags.json | tr -d '"' | sort -rV)" \ + && curl -sSL -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/prometheus/prometheus/releases" -o /tmp/releases.json \ + && VERSION_LIST="$(jq -r '.[] | select(.tag_name | contains("rc") | not) | .tag_name | split("v") | .[1]' /tmp/releases.json | tr -d '"' | sort -rV)" \ && PROMETHEUS_LATEST_VERSION="$(echo "${VERSION_LIST}" | head -n 1)" \ && PROMETHEUS_FILE_NAME="prometheus-${PROMETHEUS_LATEST_VERSION}.linux-amd64" \ && curl -fsSLO "https://github.com/prometheus/prometheus/releases/download/v${PROMETHEUS_LATEST_VERSION}/${PROMETHEUS_FILE_NAME}.tar.gz" \ diff --git a/.errcheck_excludes.txt b/.errcheck_excludes.txt deleted file mode 100644 index 0c956b4575..0000000000 --- a/.errcheck_excludes.txt +++ /dev/null @@ -1,3 +0,0 @@ -(github.com/go-kit/log.Logger).Log -fmt.Fprintln -fmt.Fprint diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d751f8c96c..7e63cb7bc8 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,21 +1,16 @@ +--- version: 2 updates: - package-ecosystem: "gomod" directory: "/" - vendor: false schedule: interval: "weekly" - labels: ["dependencies"] + open-pull-requests-limit: 20 - package-ecosystem: "docker" directory: "/" schedule: interval: "weekly" - labels: ["dependencies"] - - package-ecosystem: "github-actions" directory: "/" schedule: - interval: weekly - labels: - - "dependencies" - + interval: weekly diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 591bd8d49a..c9e2622709 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -20,6 +20,10 @@ on: schedule: - cron: '30 12 * * 1' +permissions: + contents: read + security-events: write + jobs: analyze: name: Analyze @@ -35,16 +39,16 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.21.x + go-version: 1.22.x # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 with: languages: ${{ matrix.language }} config-file: ./.github/codeql/codeql-config.yml @@ -56,7 +60,7 @@ jobs: # 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@v2 + uses: github/codeql-action/autobuild@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -70,4 +74,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13 diff --git a/.github/workflows/container-version.yaml b/.github/workflows/container-version.yaml index e4a443cd62..4f84529b4c 100644 --- a/.github/workflows/container-version.yaml +++ b/.github/workflows/container-version.yaml @@ -3,12 +3,18 @@ on: schedule: - cron: '0 * * * *' name: busybox-update workflow +permissions: + contents: read + jobs: checkVersionAndCreatePR: + permissions: + contents: write # for peter-evans/create-pull-request to create branch + pull-requests: write # for peter-evans/create-pull-request to create a PR runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Run busybox updater run: | @@ -17,7 +23,7 @@ jobs: shell: bash - name: Create Pull Request - uses: peter-evans/create-pull-request@v3 + uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0 with: signoff: true token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index d43335efa9..85b9349cfe 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -7,6 +7,9 @@ on: tags: pull_request: +permissions: + contents: read + jobs: check: runs-on: ubuntu-latest @@ -15,21 +18,21 @@ jobs: GOBIN: /tmp/.bin steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.21.x + go-version: 1.23.x - - uses: actions/cache@v3 + - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - - uses: actions/cache@v3 + - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: .mdoxcache key: ${{ runner.os }}-mdox-${{ hashFiles('docs/**/*.md', 'examples/**/*.md', 'mixin/**/*.md', '*.md') }} diff --git a/.github/workflows/go.yaml b/.github/workflows/go.yaml index 83d16f927c..1decf7fa2d 100644 --- a/.github/workflows/go.yaml +++ b/.github/workflows/go.yaml @@ -7,8 +7,42 @@ on: tags: pull_request: -# TODO(bwplotka): Add tests here. +permissions: + contents: read + jobs: + unit: + runs-on: ubuntu-latest + name: Thanos unit tests + env: + THANOS_TEST_OBJSTORE_SKIP: GCS,S3,AZURE,COS,ALIYUNOSS,BOS,OCI,OBS,SWIFT + OS_AUTH_URL: http://127.0.0.1:5000/v2.0 + OS_PASSWORD: s3cr3t + OS_PROJECT_NAME: admin + OS_REGION_NAME: RegionOne + OS_USERNAME: admin + GOBIN: /tmp/.bin + services: + swift: + image: 'quay.io/thanos/docker-swift-onlyone-authv2-keystone:v0.1' + ports: + - 5000:5000 + steps: + - name: Checkout code + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + + - name: Install Go. + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version: 1.23.x + + - name: Install bingo modules + run: make install-tool-deps + - name: Add GOBIN to path + run: echo "/tmp/.bin" >> $GITHUB_PATH + - name: Run unit tests + run: make test + cross-build-check: runs-on: ubuntu-latest name: Go build for different platforms @@ -16,14 +50,14 @@ jobs: GOBIN: /tmp/.bin steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.21.x + go-version: 1.23.x - - uses: actions/cache@v3 + - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | ~/.cache/go-build @@ -36,6 +70,33 @@ jobs: - name: Cross build check run: make crossbuild + build-stringlabels: + runs-on: ubuntu-latest + name: Go build with -tags=stringlabels + env: + GOBIN: /tmp/.bin + steps: + - name: Checkout code + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + + - name: Install Go + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version: 1.23.x + + - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + with: + path: | + ~/.cache/go-build + ~/.cache/golangci-lint + ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + + - name: Cross build check + run: go build -tags=stringlabels ./cmd/thanos + lint: runs-on: ubuntu-latest name: Linters (Static Analysis) for Go @@ -43,14 +104,14 @@ jobs: GOBIN: /tmp/.bin steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.21.x + go-version: 1.23.x - - uses: actions/cache@v3 + - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | ~/.cache/go-build @@ -66,6 +127,20 @@ jobs: - name: Linting & vetting run: make go-lint + codespell: + runs-on: ubuntu-latest + name: Check misspelled words + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Run codespell + uses: codespell-project/actions-codespell@v2 + with: + check_filenames: false + check_hidden: true + skip: ./pkg/ui/*,./pkg/store/6545postingsrepro,./internal/*,./mixin/vendor/*,./.bingo/*,go.mod,go.sum + ignore_words_list: intrumentation,mmaped,nd,ot,re-use,ser,serie,sme,sudu,tast,te,ans + e2e: strategy: fail-fast: false @@ -78,14 +153,14 @@ jobs: GOBIN: /tmp/.bin steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Install Go. - uses: actions/setup-go@v3 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.21.x + go-version: 1.23.x - - uses: actions/cache@v3 + - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: | ~/.cache/go-build diff --git a/.github/workflows/mixin.yaml b/.github/workflows/mixin.yaml index 378eae8666..08e0f3e8e1 100644 --- a/.github/workflows/mixin.yaml +++ b/.github/workflows/mixin.yaml @@ -6,17 +6,20 @@ on: pull_request: branches: [main] +permissions: + contents: read + jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.21.x + go-version: 1.22.x - name: Generate run: make examples @@ -29,12 +32,12 @@ jobs: name: Linters (Static Analysis) for Jsonnet (mixin) steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Install Go - uses: actions/setup-go@v3 + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version: 1.21.x + go-version: 1.22.x - name: Format run: | diff --git a/.github/workflows/react.yml b/.github/workflows/react.yml index cf20772f4b..c4c49d7255 100644 --- a/.github/workflows/react.yml +++ b/.github/workflows/react.yml @@ -6,6 +6,9 @@ on: - main pull_request: +permissions: + contents: read + jobs: build: runs-on: ubuntu-latest @@ -15,14 +18,14 @@ jobs: name: React UI test on Node ${{ matrix.node }} steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Install nodejs - uses: actions/setup-node@v3 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 with: node-version: ${{ matrix.node }} - - uses: actions/cache@v3 + - uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} diff --git a/.go-version b/.go-version index d2ab029d32..a1b6e17d61 100644 --- a/.go-version +++ b/.go-version @@ -1 +1 @@ -1.21 +1.23 diff --git a/.golangci.yml b/.golangci.yml index 14a5d41203..ce3b218244 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -4,25 +4,17 @@ # options for analysis running run: # timeout for analysis, e.g. 30s, 5m, default is 1m - deadline: 5m + timeout: 5m # exit code when at least one issue was found, default is 1 issues-exit-code: 1 - # which dirs to skip: they won't be analyzed; - # can use regexp here: generated.*, regexp is applied on full path; - # default value is empty list, but next dirs are always skipped independently - # from this option's value: - # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ - skip-dirs: - - vendor - - internal/cortex - - # output configuration options output: - # colored-line-number|line-number|json|tab|checkstyle, default is "colored-line-number" - format: colored-line-number + # The formats used to render issues. + formats: + - format: colored-line-number + path: stdout # print lines of code with issue, default is true print-issued-lines: true @@ -51,7 +43,11 @@ linters: linters-settings: errcheck: - exclude: ./.errcheck_excludes.txt + # List of functions to exclude from checking, where each entry is a single function to exclude. + exclude-functions: + - (github.com/go-kit/log.Logger).Log + - fmt.Fprintln + - fmt.Fprint misspell: locale: US goconst: @@ -80,3 +76,7 @@ issues: - linters: - unused text: "ruleAndAssert" + # Which dirs to exclude: issues from them won't be reported. + exclude-dirs: + - vendor + - internal/cortex diff --git a/.mdox.validate.yaml b/.mdox.validate.yaml index 94355e319e..4a3edc4dbb 100644 --- a/.mdox.validate.yaml +++ b/.mdox.validate.yaml @@ -42,3 +42,11 @@ validators: type: 'ignore' - regex: 'twitter\.com' type: 'ignore' + - regex: 'outshift\.cisco\.com\/blog\/multi-cluster-monitoring' + type: 'ignore' + # Expired certificate + - regex: 'bestpractices\.coreinfrastructure\.org\/projects\/3048' + type: 'ignore' + # Frequent DNS issues. + - regex: 'build\.thebeat\.co' + type: 'ignore' diff --git a/.promu.yml b/.promu.yml index 7e9a6ee9f9..b116e57527 100644 --- a/.promu.yml +++ b/.promu.yml @@ -1,5 +1,5 @@ go: - version: 1.21 + version: 1.23 repository: path: github.com/thanos-io/thanos build: diff --git a/CHANGELOG.md b/CHANGELOG.md index 29b6f2ae18..111b18db46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,16 +8,129 @@ NOTE: As semantic versioning states all 0.y.z releases can contain breaking chan We use *breaking :warning:* to mark changes that are not backward compatible (relates only to v0.y.z releases.) -## Unreleased +## [v0.37.2](https://github.com/thanos-io/thanos/tree/release-0.37) - 11.12.2024 ### Fixed +- [#7970](https://github.com/thanos-io/thanos/pull/7970) Sidecar: Respect min-time setting. +- [#7962](https://github.com/thanos-io/thanos/pull/7962) Store: Fix potential deadlock in hedging request. + +### Added + +### Changed + +### Removed + +## [v0.37.1](https://github.com/thanos-io/thanos/tree/release-0.37) - 04.12.2024 + +### Fixed + +- [#7674](https://github.com/thanos-io/thanos/pull/7674) Query-frontend: Fix connection to Redis cluster with TLS. +- [#7945](https://github.com/thanos-io/thanos/pull/7945) Receive: Capnproto - use segment from existing message. +- [#7941](https://github.com/thanos-io/thanos/pull/7941) Receive: Fix race condition when adding multiple new tenants, see [issue-7892](https://github.com/thanos-io/thanos/issues/7892). +- [#7954](https://github.com/thanos-io/thanos/pull/7954) Sidecar: Ensure limit param is positive for compatibility with older Prometheus. +- [#7953](https://github.com/thanos-io/thanos/pull/7953) Query: Update promql-engine for subquery avg fix. + +### Added + +### Changed + +### Removed + +## [v0.37.0](https://github.com/thanos-io/thanos/tree/release-0.37) - 25.11.2024 + +### Fixed + +- [#7511](https://github.com/thanos-io/thanos/pull/7511) Query Frontend: fix doubled gzip compression for response body. +- [#7592](https://github.com/thanos-io/thanos/pull/7592) Ruler: Only increment `thanos_rule_evaluation_with_warnings_total` metric for non PromQL warnings. +- [#7614](https://github.com/thanos-io/thanos/pull/7614) *: fix debug log formatting. +- [#7492](https://github.com/thanos-io/thanos/pull/7492) Compactor: update filtered blocks list before second downsample pass. +- [#7658](https://github.com/thanos-io/thanos/pull/7658) Store: Fix panic because too small buffer in pool. +- [#7643](https://github.com/thanos-io/thanos/pull/7643) Receive: fix thanos_receive_write_{timeseries,samples} stats +- [#7644](https://github.com/thanos-io/thanos/pull/7644) fix(ui): add null check to find overlapping blocks logic +- [#7814](https://github.com/thanos-io/thanos/pull/7814) Store: label_values: if matchers contain **name**=="something", do not add != "" to fetch less postings. +- [#7679](https://github.com/thanos-io/thanos/pull/7679) Query: respect store.limit.* flags when evaluating queries +- [#7821](https://github.com/thanos-io/thanos/pull/7821) Query/Receive: Fix coroutine leak introduced in https://github.com/thanos-io/thanos/pull/7796. +- [#7843](https://github.com/thanos-io/thanos/pull/7843) Query Frontend: fix slow query logging for non-query endpoints. +- [#7852](https://github.com/thanos-io/thanos/pull/7852) Query Frontend: pass "stats" parameter forward to queriers and fix Prometheus stats merging. +- [#7832](https://github.com/thanos-io/thanos/pull/7832) Query Frontend: Fix cache keys for dynamic split intervals. +- [#7885](https://github.com/thanos-io/thanos/pull/7885) Store: Return chunks to the pool after completing a Series call. +- [#7893](https://github.com/thanos-io/thanos/pull/7893) Sidecar: Fix retrieval of external labels for Prometheus v3.0.0. +- [#7903](https://github.com/thanos-io/thanos/pull/7903) Query: Fix panic on regex store matchers. +- [#7915](https://github.com/thanos-io/thanos/pull/7915) Store: Close block series client at the end to not reuse chunk buffer + +### Added + +- [#7763](https://github.com/thanos-io/thanos/pull/7763) Ruler: use native histograms for client latency metrics. +- [#7609](https://github.com/thanos-io/thanos/pull/7609) API: Add limit param to metadata APIs (series, label names, label values). +- [#7429](https://github.com/thanos-io/thanos/pull/7429): Reloader: introduce `TolerateEnvVarExpansionErrors` to allow suppressing errors when expanding environment variables in the configuration file. When set, this will ensure that the reloader won't consider the operation to fail when an unset environment variable is encountered. Note that all unset environment variables are left as is, whereas all set environment variables are expanded as usual. +- [#7560](https://github.com/thanos-io/thanos/pull/7560) Query: Added the possibility of filtering rules by rule_name, rule_group or file to HTTP api. +- [#7652](https://github.com/thanos-io/thanos/pull/7652) Store: Implement metadata API limit in stores. +- [#7659](https://github.com/thanos-io/thanos/pull/7659) Receive: Add support for replication using [Cap'n Proto](https://capnproto.org/). This protocol has a lower CPU and memory footprint, which leads to a reduction in resource usage in Receivers. Before enabling it, make sure that all receivers are updated to a version which supports this replication method. +- [#7853](https://github.com/thanos-io/thanos/pull/7853) UI: Add support for selecting graph time range with mouse drag. +- [#7855](https://github.com/thanos-io/thanos/pull/7855) Compcat/Query: Add support for comma separated replica labels. +- [#7654](https://github.com/thanos-io/thanos/pull/7654) *: Add '--grpc-server-tls-min-version' flag to allow user to specify TLS version, otherwise default to TLS 1.3 +- [#7854](https://github.com/thanos-io/thanos/pull/7854) Query Frontend: Add `--query-frontend.force-query-stats` flag to force collection of query statistics from upstream queriers. +- [#7860](https://github.com/thanos-io/thanos/pull/7860) Store: Support hedged requests +- [#7924](https://github.com/thanos-io/thanos/pull/7924) *: Upgrade promql-engine to `v0.0.0-20241106100125-097e6e9f425a` and objstore to `v0.0.0-20241111205755-d1dd89d41f97` +- [#7835](https://github.com/thanos-io/thanos/pull/7835) Ruler: Add ability to do concurrent rule evaluations +- [#7722](https://github.com/thanos-io/thanos/pull/7722) Query: Add partition labels flag to partition leaf querier in distributed mode + +### Changed + +- [#7494](https://github.com/thanos-io/thanos/pull/7494) Ruler: remove trailing period from SRV records returned by discovery `dnsnosrva` lookups +- [#7567](https://github.com/thanos-io/thanos/pull/7565) Query: Use thanos resolver for endpoint groups. +- [#7741](https://github.com/thanos-io/thanos/pull/7741) Deps: Bump Objstore to `v0.0.0-20240913074259-63feed0da069` +- [#7813](https://github.com/thanos-io/thanos/pull/7813) Receive: enable initial TSDB compaction time randomization +- [#7820](https://github.com/thanos-io/thanos/pull/7820) Sidecar: Use prometheus metrics for min timestamp +- [#7886](https://github.com/thanos-io/thanos/pull/7886) Discovery: Preserve results from other resolve calls +- [#7745](https://github.com/thanos-io/thanos/pull/7745) *: Build with Prometheus stringlabels tags +- [#7669](https://github.com/thanos-io/thanos/pull/7669) Receive: Change quorum calculation for rf=2 + +### Removed + +- [#7704](https://github.com/thanos-io/thanos/pull/7704) *: *breaking :warning:* remove Store gRPC Info function. This has been deprecated for 3 years, its time to remove it. +- [#7793](https://github.com/thanos-io/thanos/pull/7793) Receive: Disable dedup proxy in multi-tsdb +- [#7678](https://github.com/thanos-io/thanos/pull/7678) Query: Skip formatting strings if debug logging is disabled + +## [v0.36.1](https://github.com/thanos-io/thanos/tree/release-0.36) + +### Fixed + +- [#7634](https://github.com/thanos-io/thanos/pull/7634) Rule: fix Query and Alertmanager TLS configurations with CA only. +- [#7618](https://github.com/thanos-io/thanos/pull/7618) Proxy: Query goroutine leak when store.response-timeout is set + ### Added ### Changed ### Removed +## [v0.36.0](https://github.com/thanos-io/thanos/tree/release-0.36) + +### Fixed + +- [#7326](https://github.com/thanos-io/thanos/pull/7326) Query: fixing exemplars proxy when querying stores with multiple tenants. +- [#7403](https://github.com/thanos-io/thanos/pull/7403) Sidecar: fix startup sequence +- [#7484](https://github.com/thanos-io/thanos/pull/7484) Proxy: fix panic in lazy response set +- [#7493](https://github.com/thanos-io/thanos/pull/7493) *: fix server grpc histograms + +### Added + +- [#7317](https://github.com/thanos-io/thanos/pull/7317) Tracing: allow specifying resource attributes for the OTLP configuration. +- [#7367](https://github.com/thanos-io/thanos/pull/7367) Store Gateway: log request ID in request logs. +- [#7361](https://github.com/thanos-io/thanos/pull/7361) Query: *breaking :warning:* pass query stats from remote execution from server to client. We changed the protobuf of the QueryAPI, if you use `query.mode=distributed` you need to update your client (upper level Queriers) first, before updating leaf Queriers (servers). +- [#7363](https://github.com/thanos-io/thanos/pull/7363) Query-frontend: set value of remote_user field in Slow Query Logs from HTTP header +- [#7335](https://github.com/thanos-io/thanos/pull/7335) Dependency: Update minio-go to v7.0.70 which includes support for EKS Pod Identity. +- [#7477](https://github.com/thanos-io/thanos/pull/7477) *: Bump objstore to `20240622095743-1afe5d4bc3cd` + +### Changed + +- [#7334](https://github.com/thanos-io/thanos/pull/7334) Compactor: do not vertically compact downsampled blocks. Such cases are now marked with `no-compact-mark.json`. Fixes panic `panic: unexpected seriesToChunkEncoder lack of iterations`. +- [#7393](https://github.com/thanos-io/thanos/pull/7393) *: *breaking :warning:* Using native histograms for grpc middleware metrics. Metrics `grpc_client_handling_seconds` and `grpc_server_handling_seconds` will now be native histograms, if you have enabled native histogram scraping you will need to update your PromQL expressions to use the new metric names. + +### Removed + ## [v0.35.1](https://github.com/thanos-io/thanos/tree/release-0.35) - 28.05.2024 ### Fixed @@ -54,6 +167,7 @@ We use *breaking :warning:* to mark changes that are not backward compatible (re - [#7271](https://github.com/thanos-io/thanos/pull/7271) Query: fixing dedup iterator when working on mixed sample types. - [#7289](https://github.com/thanos-io/thanos/pull/7289) Query Frontend: show warnings from downstream queries. - [#7308](https://github.com/thanos-io/thanos/pull/7308) Store: Batch TSDB Infos for blocks. +- [#7301](https://github.com/thanos-io/thanos/pull/7301) Store Gateway: fix index header reader `PostingsOffsets` returning wrong values. ### Added @@ -157,6 +271,7 @@ We use *breaking :warning:* to mark changes that are not backward compatible (re - [#6753](https://github.com/thanos-io/thanos/pull/6753) mixin(Rule): *breaking :warning:* Fixed the mixin rules with duplicate names and updated the promtool version from v0.37.0 to v0.47.0 - [#6772](https://github.com/thanos-io/thanos/pull/6772) *: Bump prometheus to v0.47.2-0.20231006112807-a5a4eab679cc - [#6794](https://github.com/thanos-io/thanos/pull/6794) Receive: the exported HTTP metrics now uses the specified default tenant for requests where no tenants are found. +- [#6651](https://github.com/thanos-io/thanos/pull/6651) *: Update go_grpc_middleware to v2.0.0. Remove Tags Interceptor from Thanos. Tags interceptor is removed from v2.0.0 go-grpc-middleware and is not needed anymore. ### Removed @@ -283,7 +398,7 @@ We use *breaking :warning:* to mark changes that are not backward compatible (re - [#6342](https://github.com/thanos-io/thanos/pull/6342) Cache/Redis: Upgrade `rueidis` to v1.0.2 to to improve error handling while shrinking a redis cluster. - [#6325](https://github.com/thanos-io/thanos/pull/6325) Store: return gRPC resource exhausted error for byte limiter. - [#6399](https://github.com/thanos-io/thanos/pull/6399) *: Fix double-counting bug in http_request_duration metric -- [#6428](https://github.com/thanos-io/thanos/pull/6428) Report gRPC connnection errors in the logs. +- [#6428](https://github.com/thanos-io/thanos/pull/6428) Report gRPC connection errors in the logs. - [#6519](https://github.com/thanos-io/thanos/pull/6519) Reloader: Use timeout for initial apply. - [#6509](https://github.com/thanos-io/thanos/pull/6509) Store Gateway: Remove `memWriter` from `fileWriter` to reduce memory usage when sync index headers. - [#6556](https://github.com/thanos-io/thanos/pull/6556) Thanos compact: respect block-files-concurrency setting when downsampling @@ -405,7 +520,7 @@ NOTE: Querier's `query.promql-engine` flag enabling new PromQL engine is now unh - [#5889](https://github.com/thanos-io/thanos/pull/5889) Query Frontend: Added support for vertical sharding `label_replace` and `label_join` functions. - [#5865](https://github.com/thanos-io/thanos/pull/5865) Compact: Retry on sync metas error. - [#5819](https://github.com/thanos-io/thanos/pull/5819) Store: Added a few objectives for Store's data summaries (touched/fetched amount and sizes). They are: 50, 95, and 99 quantiles. -- [#5837](https://github.com/thanos-io/thanos/pull/5837) Store: Added streaming retrival of series from object storage. +- [#5837](https://github.com/thanos-io/thanos/pull/5837) Store: Added streaming retrieval of series from object storage. - [#5940](https://github.com/thanos-io/thanos/pull/5940) Objstore: Support for authenticating to Swift using application credentials. - [#5945](https://github.com/thanos-io/thanos/pull/5945) Tools: Added new `no-downsample` marker to skip blocks when downsampling via `thanos tools bucket mark --marker=no-downsample-mark.json`. This will skip downsampling for blocks with the new marker. - [#5977](https://github.com/thanos-io/thanos/pull/5977) Tools: Added remove flag on bucket mark command to remove deletion, no-downsample or no-compact markers on the block @@ -561,7 +676,7 @@ NOTE: Querier's `query.promql-engine` flag enabling new PromQL engine is now unh - [#5170](https://github.com/thanos-io/thanos/pull/5170) All: Upgraded the TLS version from TLS1.2 to TLS1.3. - [#5205](https://github.com/thanos-io/thanos/pull/5205) Rule: Add ruler labels as external labels in stateless ruler mode. - [#5206](https://github.com/thanos-io/thanos/pull/5206) Cache: Add timeout for groupcache's fetch operation. -- [#5218](https://github.com/thanos-io/thanos/pull/5218) Tools: Thanos tools bucket downsample is now running continously. +- [#5218](https://github.com/thanos-io/thanos/pull/5218) Tools: Thanos tools bucket downsample is now running continuously. - [#5231](https://github.com/thanos-io/thanos/pull/5231) Tools: Bucket verify tool ignores blocks with deletion markers. - [#5244](https://github.com/thanos-io/thanos/pull/5244) Query: Promote negative offset and `@` modifier to stable features as per Prometheus [#10121](https://github.com/prometheus/prometheus/pull/10121). - [#5255](https://github.com/thanos-io/thanos/pull/5255) InfoAPI: Set store API unavailable when stores are not ready. @@ -1321,7 +1436,7 @@ sse_config: - [#1666](https://github.com/thanos-io/thanos/pull/1666) Compact: `thanos_compact_group_compactions_total` now counts block compactions, so operations that resulted in a compacted block. The old behaviour is now exposed by new metric: `thanos_compact_group_compaction_runs_started_total` and `thanos_compact_group_compaction_runs_completed_total` which counts compaction runs overall. - [#1748](https://github.com/thanos-io/thanos/pull/1748) Updated all dependencies. -- [#1694](https://github.com/thanos-io/thanos/pull/1694) `prober_ready` and `prober_healthy` metrics are removed, for sake of `status`. Now `status` exposes same metric with a label, `check`. `check` can have "healty" or "ready" depending on status of the probe. +- [#1694](https://github.com/thanos-io/thanos/pull/1694) `prober_ready` and `prober_healthy` metrics are removed, for sake of `status`. Now `status` exposes same metric with a label, `check`. `check` can have "healthy" or "ready" depending on status of the probe. - [#1790](https://github.com/thanos-io/thanos/pull/1790) Ruler: Fixes subqueries support for ruler. - [#1769](https://github.com/thanos-io/thanos/pull/1769) & [#1545](https://github.com/thanos-io/thanos/pull/1545) Adjusted most of the metrics histogram buckets. @@ -1553,7 +1668,7 @@ This version moved tarballs to Golang 1.12.5 from 1.11 as well, so same warning - query: - [BUGFIX] Make sure subquery range is taken into account for selection #5467 - [ENHANCEMENT] Check for cancellation on every step of a range evaluation. #5131 - - [BUGFIX] Exponentation operator to drop metric name in result of operation. #5329 + - [BUGFIX] Exponentiation operator to drop metric name in result of operation. #5329 - [BUGFIX] Fix output sample values for scalar-to-vector comparison operations. #5454 - rule: - [BUGFIX] Reload rules: copy state on both name and labels. #5368 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7ef8298215..31697b0e5c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,7 +68,7 @@ The following section explains various suggestions and procedures to note during * It is strongly recommended that you use Linux distributions systems or macOS for development. * Running [WSL 2 (on Windows)](https://learn.microsoft.com/en-us/windows/wsl/) is also possible. Note that if during development you run a local Kubernetes cluster and have a Service with `service.spec.sessionAffinity: ClientIP`, it will break things until it's removed[^windows_xt_recent]. -* Go 1.21.x or higher. +* Go 1.22.x or higher. * Docker (to run e2e tests) * For React UI, you will need a working NodeJS environment and the npm package manager to compile the Web UI assets. @@ -164,7 +164,7 @@ $ git push origin **Formatting** -First of all, fall back to `make help` to see all availible commands. There are a few checks that happen when making a PR and these need to pass. We can make sure locally before making the PR by using commands that are related to your changes: +First of all, fall back to `make help` to see all available commands. There are a few checks that happen when making a PR and these need to pass. We can make sure locally before making the PR by using commands that are related to your changes: - `make docs` generates, formats and cleans up white noise. - `make changed-docs` does same as above, but just for changed docs by checking `git diff` on which files are changed. - `make check-docs` generates, formats, cleans up white noise and checks links. Since it can be annoying to wait on link check results - it takes forever - to skip the check, you can use `make docs`). diff --git a/Dockerfile.e2e-tests b/Dockerfile.e2e-tests index 58b898cc06..00b2a77656 100644 --- a/Dockerfile.e2e-tests +++ b/Dockerfile.e2e-tests @@ -1,5 +1,5 @@ # Taking a non-alpine image for e2e tests so that cgo can be enabled for the race detector. -FROM golang:1.21 as builder +FROM golang:1.23.3 as builder WORKDIR $GOPATH/src/github.com/thanos-io/thanos @@ -8,7 +8,7 @@ COPY . $GOPATH/src/github.com/thanos-io/thanos RUN CGO_ENABLED=1 go build -o $GOBIN/thanos -race ./cmd/thanos # ----------------------------------------------------------------------------- -FROM golang:1.21 +FROM golang:1.23 LABEL maintainer="The Thanos Authors" COPY --from=builder $GOBIN/thanos /bin/thanos diff --git a/Dockerfile.multi-stage b/Dockerfile.multi-stage index a7b58f8bb2..9ecc1144ee 100644 --- a/Dockerfile.multi-stage +++ b/Dockerfile.multi-stage @@ -1,6 +1,6 @@ # By default we pin to amd64 sha. Use make docker to automatically adjust for arm64 versions. ARG BASE_DOCKER_SHA="14d68ca3d69fceaa6224250c83d81d935c053fb13594c811038c461194599973" -FROM golang:1.21-alpine3.18 as builder +FROM golang:1.23.3-alpine3.20 as builder WORKDIR $GOPATH/src/github.com/thanos-io/thanos # Change in the docker context invalidates the cache so to leverage docker diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 16d51e8552..97d97b62ac 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -5,15 +5,14 @@ | Bartłomiej Płotka | bwplotka@gmail.com | `@bwplotka` | [@bwplotka](https://github.com/bwplotka) | Google | | Frederic Branczyk | fbranczyk@gmail.com | `@brancz` | [@brancz](https://github.com/brancz) | Polar Signals | | Giedrius Statkevičius | giedriuswork@gmail.com | `@Giedrius Statkevičius` | [@GiedriusS](https://github.com/GiedriusS) | Vinted | -| Kemal Akkoyun | kakkoyun@gmail.com | `@kakkoyun` | [@kakkoyun](https://github.com/kakkoyun) | Fal | +| Kemal Akkoyun | kakkoyun@gmail.com | `@kakkoyun` | [@kakkoyun](https://github.com/kakkoyun) | Independent | | Lucas Servén Marín | lserven@gmail.com | `@squat` | [@squat](https://github.com/squat) | Red Hat | | Prem Saraswat | prmsrswt@gmail.com | `@Prem Saraswat` | [@onprem](https://github.com/onprem) | Red Hat | -| Matthias Loibl | mail@matthiasloibl.com | `@metalmatze` | [@metalmatze](https://github.com/metalmatze) | Polar Signals | | Ben Ye | yb532204897@gmail.com | `@yeya24` | [@yeya24](https://github.com/yeya24) | Amazon Web Services | | Matej Gera | matejgera@gmail.com | `@Matej Gera` | [@matej-g](https://github.com/matej-g) | Coralogix | | Filip Petkovski | filip.petkovsky@gmail.com | `@Filip Petkovski` | [@fpetkovski](https://github.com/fpetkovski) | Shopify | | Saswata Mukherjee | saswata.mukhe@gmail.com | `@saswatamcode` | [@saswatamcode](https://github.com/saswatamcode) | Red Hat | -| Michael Hoffmann | mhoffm@posteo.de | `@Michael Hoffmann` | [@MichaHoffmann](https://github.com/MichaHoffmann) | Aiven | +| Michael Hoffmann | mhoffm@posteo.de | `@Michael Hoffmann` | [@MichaHoffmann](https://github.com/MichaHoffmann) | Cloudflare | We are bunch of people from different companies with various interests and skills. We are from different parts of the world: Germany, Holland, Lithuania, US, UK and India. We have something in common though: We all share the love for OpenSource, Go, Prometheus, :coffee: and Observability topics. @@ -31,15 +30,17 @@ We also have some nice souls that help triaging issues and PRs. See [here](https Full list of triage persons is displayed below: -| Name | Slack | GitHub | Company | -|----------------|------------------|----------------------------------------------------|---------| -| Adrien Fillon | `@Adrien F` | [@adrien-f](https://github.com/adrien-f) | | -| Ian Billett | `@billett` | [@bill3tt](https://github.com/bill3tt) | Red Hat | -| Martin Chodur | `@FUSAKLA` | [@fusakla](https://github.com/fusakla) | | -| Michael Dai | `@jojohappy` | [@jojohappy](https://github.com/jojohappy) | | -| Xiang Dai | `@daixiang0` | [@daixiang0](https://github.com/daixiang0) | | -| Jimmie Han | `@hanjm` | [@hanjm](https://github.com/hanjm) | Tencent | -| Douglas Camata | `@douglascamata` | [@douglascamata](https://github.com/douglascamata) | Red Hat | +| Name | Slack | GitHub | Company | +|----------------|------------------|----------------------------------------------------|---------------------| +| Adrien Fillon | `@Adrien F` | [@adrien-f](https://github.com/adrien-f) | | +| Ian Billett | `@billett` | [@bill3tt](https://github.com/bill3tt) | Red Hat | +| Martin Chodur | `@FUSAKLA` | [@fusakla](https://github.com/fusakla) | | +| Michael Dai | `@jojohappy` | [@jojohappy](https://github.com/jojohappy) | | +| Xiang Dai | `@daixiang0` | [@daixiang0](https://github.com/daixiang0) | | +| Jimmie Han | `@hanjm` | [@hanjm](https://github.com/hanjm) | Tencent | +| Douglas Camata | `@douglascamata` | [@douglascamata](https://github.com/douglascamata) | Red Hat | +| Harry John | `@harry671003` | [@harry671003](https://github.com/harry671003) | Amazon Web Services | +| Pedro Tanaka | `@pedro.tanaka` | [@pedro-stanaka](https://github.com/pedro-stanaka) | Shopify | Please reach any of the maintainer on slack or email if you want to help as well. @@ -107,4 +108,4 @@ Fabian Reinartz @fabxc and Bartłomiej Płotka @bwplotka ## Previous Maintainers -Dominic Green, Povilas Versockas, Marco Pracucci +Dominic Green, Povilas Versockas, Marco Pracucci, Matthias Loibl diff --git a/Makefile b/Makefile index bee70ee848..fd3f4acc61 100644 --- a/Makefile +++ b/Makefile @@ -295,6 +295,13 @@ proto: ## Generates Go files from Thanos proto files. proto: check-git $(GOIMPORTS) $(PROTOC) $(PROTOC_GEN_GOGOFAST) @GOIMPORTS_BIN="$(GOIMPORTS)" PROTOC_BIN="$(PROTOC)" PROTOC_GEN_GOGOFAST_BIN="$(PROTOC_GEN_GOGOFAST)" PROTOC_VERSION="$(PROTOC_VERSION)" scripts/genproto.sh +.PHONY: capnp +capnp: ## Generates Go files from Thanos capnproto files. +capnp: check-git + capnp compile -I $(shell go list -m -f '{{.Dir}}' capnproto.org/go/capnp/v3)/std -ogo pkg/receive/writecapnp/write_request.capnp + @$(GOIMPORTS) -w pkg/receive/writecapnp/write_request.capnp.go + go run ./scripts/copyright + .PHONY: tarballs-release tarballs-release: ## Build tarballs. tarballs-release: $(PROMU) @@ -395,8 +402,7 @@ go-lint: check-git deps $(GOLANGCI_LINT) $(FAILLINT) $(call require_clean_work_tree,'detected not clean work tree before running lint, previous job changed something?') @echo ">> verifying modules being imported" @# TODO(bwplotka): Add, Printf, DefaultRegisterer, NewGaugeFunc and MustRegister once exception are accepted. Add fmt.{Errorf}=github.com/pkg/errors.{Errorf} once https://github.com/fatih/faillint/issues/10 is addressed. - @$(FAILLINT) -paths "errors=github.com/pkg/errors,\ -github.com/prometheus/tsdb=github.com/prometheus/prometheus/tsdb,\ + @$(FAILLINT) -paths "github.com/prometheus/tsdb=github.com/prometheus/prometheus/tsdb,\ github.com/prometheus/prometheus/pkg/testutils=github.com/thanos-io/thanos/pkg/testutil,\ github.com/prometheus/client_golang/prometheus.{DefaultGatherer,DefBuckets,NewUntypedFunc,UntypedFunc},\ github.com/prometheus/client_golang/prometheus.{NewCounter,NewCounterVec,NewCounterVec,NewGauge,NewGaugeVec,NewGaugeFunc,\ @@ -404,6 +410,7 @@ NewHistorgram,NewHistogramVec,NewSummary,NewSummaryVec}=github.com/prometheus/cl NewCounterVec,NewCounterVec,NewGauge,NewGaugeVec,NewGaugeFunc,NewHistorgram,NewHistogramVec,NewSummary,NewSummaryVec},\ github.com/NYTimes/gziphandler.{GzipHandler}=github.com/klauspost/compress/gzhttp.{GzipHandler},\ sync/atomic=go.uber.org/atomic,github.com/cortexproject/cortex=github.com/thanos-io/thanos/internal/cortex,\ +github.com/prometheus/prometheus/promql/parser.{ParseExpr,ParseMetricSelector}=github.com/thanos-io/thanos/pkg/extpromql.{ParseExpr,ParseMetricSelector},\ io/ioutil.{Discard,NopCloser,ReadAll,ReadDir,ReadFile,TempDir,TempFile,Writefile}" $(shell go list ./... | grep -v "internal/cortex") @$(FAILLINT) -paths "fmt.{Print,Println,Sprint}" -ignore-tests ./... @echo ">> linting all of the Go files GOGC=${GOGC}" diff --git a/README.md b/README.md index f47c244121..fe97c79997 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![CI](https://github.com/thanos-io/thanos/workflows/CI/badge.svg)](https://github.com/thanos-io/thanos/actions?query=workflow%3ACI) [![CI](https://circleci.com/gh/thanos-io/thanos.svg?style=svg)](https://circleci.com/gh/thanos-io/thanos) [![go](https://github.com/thanos-io/thanos/workflows/go/badge.svg)](https://github.com/thanos-io/thanos/actions?query=workflow%3Ago) [![react](https://github.com/thanos-io/thanos/workflows/react/badge.svg)](https://github.com/thanos-io/thanos/actions?query=workflow%3Areact) [![docs](https://github.com/thanos-io/thanos/workflows/docs/badge.svg)](https://github.com/thanos-io/thanos/actions?query=workflow%3Adocs) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/thanos-io/thanos) [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=109162639) -> 📢 [ThanosCon](https://thanos.io/blog/2023-20-11-thanoscon/) is happening on 19th March as a co-located half-day on KubeCon EU in Paris. Join us there! 🤗 CFP is open until 3rd December! +> 📢 [ThanosCon](https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/co-located-events/thanoscon/) happened on 19th March 2024 as a co-located half-day on KubeCon EU in Paris. ## Overview diff --git a/VERSION b/VERSION index 731b95d7fc..8570a3aeb9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.35.1 +0.37.2 diff --git a/cmd/thanos/compact.go b/cmd/thanos/compact.go index f1437efc64..3d955ee394 100644 --- a/cmd/thanos/compact.go +++ b/cmd/thanos/compact.go @@ -46,6 +46,7 @@ import ( "github.com/thanos-io/thanos/pkg/runutil" httpserver "github.com/thanos-io/thanos/pkg/server/http" "github.com/thanos-io/thanos/pkg/store" + "github.com/thanos-io/thanos/pkg/strutil" "github.com/thanos-io/thanos/pkg/tracing" "github.com/thanos-io/thanos/pkg/ui" ) @@ -205,7 +206,7 @@ func runCompact( return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.String(), nil) if err != nil { return err } @@ -254,10 +255,11 @@ func runCompact( } enableVerticalCompaction := conf.enableVerticalCompaction - if len(conf.dedupReplicaLabels) > 0 { + dedupReplicaLabels := strutil.ParseFlagLabels(conf.dedupReplicaLabels) + if len(dedupReplicaLabels) > 0 { enableVerticalCompaction = true level.Info(logger).Log( - "msg", "deduplication.replica-label specified, enabling vertical compaction", "dedupReplicaLabels", strings.Join(conf.dedupReplicaLabels, ","), + "msg", "deduplication.replica-label specified, enabling vertical compaction", "dedupReplicaLabels", strings.Join(dedupReplicaLabels, ","), ) } if enableVerticalCompaction { @@ -275,7 +277,7 @@ func runCompact( labelShardedMetaFilter, consistencyDelayMetaFilter, ignoreDeletionMarkFilter, - block.NewReplicaLabelRemover(logger, conf.dedupReplicaLabels), + block.NewReplicaLabelRemover(logger, dedupReplicaLabels), duplicateBlocksFilter, noCompactMarkerFilter, } @@ -288,6 +290,11 @@ func runCompact( cf.UpdateOnChange(func(blocks []metadata.Meta, err error) { api.SetLoaded(blocks, err) }) + + var syncMetasTimeout = conf.waitInterval + if !conf.wait { + syncMetasTimeout = 0 + } sy, err = compact.NewMetaSyncer( logger, reg, @@ -297,6 +304,7 @@ func runCompact( ignoreDeletionMarkFilter, compactMetrics.blocksMarked.WithLabelValues(metadata.DeletionMarkFilename, ""), compactMetrics.garbageCollectedBlocks, + syncMetasTimeout, ) if err != nil { return errors.Wrap(err, "create syncer") @@ -326,7 +334,7 @@ func runCompact( case compact.DedupAlgorithmPenalty: mergeFunc = dedup.NewChunkSeriesMerger() - if len(conf.dedupReplicaLabels) == 0 { + if len(dedupReplicaLabels) == 0 { return errors.New("penalty based deduplication needs at least one replica label specified") } case "": @@ -369,13 +377,20 @@ func runCompact( conf.blockFilesConcurrency, conf.compactBlocksFetchConcurrency, ) + var planner compact.Planner + tsdbPlanner := compact.NewPlanner(logger, levels, noCompactMarkerFilter) - planner := compact.WithLargeTotalIndexSizeFilter( + largeIndexFilterPlanner := compact.WithLargeTotalIndexSizeFilter( tsdbPlanner, insBkt, int64(conf.maxBlockIndexSize), compactMetrics.blocksMarked.WithLabelValues(metadata.NoCompactMarkFilename, metadata.IndexSizeExceedingNoCompactReason), ) + if enableVerticalCompaction { + planner = compact.WithVerticalCompactionDownsampleFilter(largeIndexFilterPlanner, insBkt, compactMetrics.blocksMarked.WithLabelValues(metadata.NoCompactMarkFilename, metadata.DownsampleVerticalCompactionNoCompactReason)) + } else { + planner = largeIndexFilterPlanner + } blocksCleaner := compact.NewBlocksCleaner(logger, insBkt, ignoreDeletionMarkFilter, deleteDelay, compactMetrics.blocksCleaned, compactMetrics.blockCleanupFailures) compactor, err := compact.NewBucketCompactor( logger, @@ -481,6 +496,14 @@ func runCompact( return errors.Wrap(err, "sync before second pass of downsampling") } + // Regenerate the filtered list of blocks after the sync, + // to include the blocks created by the first pass. + filteredMetas = sy.Metas() + noDownsampleBlocks = noDownsampleMarkerFilter.NoDownsampleMarkedBlocks() + for ul := range noDownsampleBlocks { + delete(filteredMetas, ul) + } + if err := downsampleBucket( ctx, logger, @@ -803,8 +826,9 @@ func (cc *compactConfig) registerFlag(cmd extkingpin.FlagClause) { "When set to penalty, penalty based deduplication algorithm will be used. At least one replica label has to be set via --deduplication.replica-label flag."). Default("").EnumVar(&cc.dedupFunc, compact.DedupAlgorithmPenalty, "") - cmd.Flag("deduplication.replica-label", "Label to treat as a replica indicator of blocks that can be deduplicated (repeated flag). This will merge multiple replica blocks into one. This process is irreversible."+ - "Experimental. When one or more labels are set, compactor will ignore the given labels so that vertical compaction can merge the blocks."+ + cmd.Flag("deduplication.replica-label", "Experimental. Label to treat as a replica indicator of blocks that can be deduplicated (repeated flag). This will merge multiple replica blocks into one. This process is irreversible. "+ + "Flag may be specified multiple times as well as a comma separated list of labels. "+ + "When one or more labels are set, compactor will ignore the given labels so that vertical compaction can merge the blocks."+ "Please note that by default this uses a NAIVE algorithm for merging which works well for deduplication of blocks with **precisely the same samples** like produced by Receiver replication."+ "If you need a different deduplication algorithm (e.g one that works well with Prometheus replicas), please set it via --deduplication.func."). StringsVar(&cc.dedupReplicaLabels) diff --git a/cmd/thanos/config.go b/cmd/thanos/config.go index a6abd7c3c9..f72d19fd79 100644 --- a/cmd/thanos/config.go +++ b/cmd/thanos/config.go @@ -8,7 +8,6 @@ package main import ( "net/url" - "sort" "strconv" "strings" "time" @@ -29,6 +28,7 @@ type grpcConfig struct { tlsSrvCert string tlsSrvKey string tlsSrvClientCA string + tlsMinVersion string gracePeriod time.Duration maxConnectionAge time.Duration } @@ -46,6 +46,9 @@ func (gc *grpcConfig) registerFlag(cmd extkingpin.FlagClause) *grpcConfig { cmd.Flag("grpc-server-tls-client-ca", "TLS CA to verify clients against. If no client CA is specified, there is no client verification on server side. (tls.NoClientCert)"). Default("").StringVar(&gc.tlsSrvClientCA) + cmd.Flag("grpc-server-tls-min-version", + "TLS supported minimum version for gRPC server. If no version is specified, it'll default to 1.3. Allowed values: [\"1.0\", \"1.1\", \"1.2\", \"1.3\"]"). + Default("1.3").StringVar(&gc.tlsMinVersion) cmd.Flag("grpc-server-max-connection-age", "The grpc server max connection age. This controls how often to re-establish connections and redo TLS handshakes."). Default("60m").DurationVar(&gc.maxConnectionAge) cmd.Flag("grpc-grace-period", @@ -266,23 +269,23 @@ func (ac *alertMgrConfig) registerFlag(cmd extflag.FlagClause) *alertMgrConfig { } func parseFlagLabels(s []string) (labels.Labels, error) { - var lset labels.Labels + var lset labels.ScratchBuilder for _, l := range s { parts := strings.SplitN(l, "=", 2) if len(parts) != 2 { - return nil, errors.Errorf("unrecognized label %q", l) + return labels.EmptyLabels(), errors.Errorf("unrecognized label %q", l) } if !model.LabelName.IsValid(model.LabelName(parts[0])) { - return nil, errors.Errorf("unsupported format for label %s", l) + return labels.EmptyLabels(), errors.Errorf("unsupported format for label %s", l) } val, err := strconv.Unquote(parts[1]) if err != nil { - return nil, errors.Wrap(err, "unquote label value") + return labels.EmptyLabels(), errors.Wrap(err, "unquote label value") } - lset = append(lset, labels.Label{Name: parts[0], Value: val}) + lset.Add(parts[0], val) } - sort.Sort(lset) - return lset, nil + lset.Sort() + return lset.Labels(), nil } type goMemLimitConfig struct { diff --git a/cmd/thanos/downsample.go b/cmd/thanos/downsample.go index a5cd5c38ed..556369b0a1 100644 --- a/cmd/thanos/downsample.go +++ b/cmd/thanos/downsample.go @@ -84,7 +84,7 @@ func RunDownsample( return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Downsample.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Downsample.String(), nil) if err != nil { return err } diff --git a/cmd/thanos/main.go b/cmd/thanos/main.go index a29d702d0d..ea201d62b6 100644 --- a/cmd/thanos/main.go +++ b/cmd/thanos/main.go @@ -74,7 +74,7 @@ func main() { // Running in container with limits but with empty/wrong value of GOMAXPROCS env var could lead to throttling by cpu // maxprocs will automate adjustment by using cgroups info about cpu limit if it set as value for runtime.GOMAXPROCS. undo, err := maxprocs.Set(maxprocs.Logger(func(template string, args ...interface{}) { - level.Debug(logger).Log("msg", fmt.Sprintf(template, args)) + level.Debug(logger).Log("msg", fmt.Sprintf(template, args...)) })) defer undo() if err != nil { diff --git a/cmd/thanos/main_test.go b/cmd/thanos/main_test.go index fcc394a614..6cbd84cb15 100644 --- a/cmd/thanos/main_test.go +++ b/cmd/thanos/main_test.go @@ -105,6 +105,16 @@ func (b *erroringBucket) Name() string { return b.bkt.Name() } +// IterWithAttributes allows to iterate over objects in the bucket with their attributes. +func (b *erroringBucket) IterWithAttributes(ctx context.Context, dir string, f func(objstore.IterObjectAttributes) error, options ...objstore.IterOption) error { + return b.bkt.IterWithAttributes(ctx, dir, f, options...) +} + +// SupportedIterOptions returns the supported iteration options. +func (b *erroringBucket) SupportedIterOptions() []objstore.IterOptionType { + return b.bkt.SupportedIterOptions() +} + // Ensures that downsampleBucket() stops its work properly // after an error occurs with some blocks in the backlog. // Testing for https://github.com/thanos-io/thanos/issues/4960. diff --git a/cmd/thanos/query.go b/cmd/thanos/query.go index 424d9c6224..69ffb8ea32 100644 --- a/cmd/thanos/query.go +++ b/cmd/thanos/query.go @@ -17,7 +17,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" grpc_logging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" "github.com/oklog/run" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" @@ -57,6 +56,7 @@ import ( httpserver "github.com/thanos-io/thanos/pkg/server/http" "github.com/thanos-io/thanos/pkg/store" "github.com/thanos-io/thanos/pkg/store/labelpb" + "github.com/thanos-io/thanos/pkg/strutil" "github.com/thanos-io/thanos/pkg/targets" "github.com/thanos-io/thanos/pkg/tenancy" "github.com/thanos-io/thanos/pkg/tls" @@ -123,8 +123,9 @@ func registerQuery(app *extkingpin.App) { Default(string(query.ExternalLabels), string(query.StoreType)). Enums(string(query.ExternalLabels), string(query.StoreType)) - queryReplicaLabels := cmd.Flag("query.replica-label", "Labels to treat as a replica indicator along which data is deduplicated. Still you will be able to query without deduplication using 'dedup=false' parameter. Data includes time series, recording rules, and alerting rules."). + queryReplicaLabels := cmd.Flag("query.replica-label", "Labels to treat as a replica indicator along which data is deduplicated. Still you will be able to query without deduplication using 'dedup=false' parameter. Data includes time series, recording rules, and alerting rules. Flag may be specified multiple times as well as a comma separated list of labels."). Strings() + queryPartitionLabels := cmd.Flag("query.partition-label", "Labels that partition the leaf queriers. This is used to scope down the labelsets of leaf queriers when using the distributed query mode. If set, these labels must form a partition of the leaf queriers. Partition labels must not intersect with replica labels. Every TSDB of a leaf querier must have these labels. This is useful when there are multiple external labels that are irrelevant for the partition as it allows the distributed engine to ignore them for some optimizations. If this is empty then all labels are used as partition labels.").Strings() instantDefaultMaxSourceResolution := extkingpin.ModelDuration(cmd.Flag("query.instant.default.max_source_resolution", "default value for max_source_resolution for instant queries. If not set, defaults to 0s only taking raw resolution into account. 1h can be a good value if you use instant queries over time ranges that incorporate times outside of your raw-retention.").Default("0s").Hidden()) @@ -259,7 +260,8 @@ func registerQuery(app *extkingpin.App) { return errors.Wrap(err, "error while parsing config for request logging") } - tagOpts, grpcLogOpts, err := logging.ParsegRPCOptions(reqLogConfig) + grpcLogOpts, logFilterMethods, err := logging.ParsegRPCOptions(reqLogConfig) + if err != nil { return errors.Wrap(err, "error while parsing config for request logging") } @@ -301,7 +303,7 @@ func registerQuery(app *extkingpin.App) { tracer, httpLogOpts, grpcLogOpts, - tagOpts, + logFilterMethods, grpcServerConfig, *grpcCompression, *secure, @@ -326,6 +328,7 @@ func registerQuery(app *extkingpin.App) { time.Duration(*storeResponseTimeout), *queryConnMetricLabels, *queryReplicaLabels, + *queryPartitionLabels, selectorLset, getFlagsMap(cmd.Flags()), *endpoints, @@ -355,7 +358,6 @@ func registerQuery(app *extkingpin.App) { *webDisableCORS, *alertQueryURL, *grpcProxyStrategy, - component.Query, *queryTelemetryDurationQuantiles, *queryTelemetrySamplesQuantiles, *queryTelemetrySeriesQuantiles, @@ -383,7 +385,7 @@ func runQuery( tracer opentracing.Tracer, httpLogOpts []logging.Option, grpcLogOpts []grpc_logging.Option, - tagOpts []tags.Option, + logFilterMethods []string, grpcServerConfig grpcConfig, grpcCompression string, secure bool, @@ -408,6 +410,7 @@ func runQuery( storeResponseTimeout time.Duration, queryConnMetricLabels []string, queryReplicaLabels []string, + queryPartitionLabels []string, selectorLset labels.Labels, flagsMap map[string]string, endpointAddrs []string, @@ -437,7 +440,6 @@ func runQuery( disableCORS bool, alertQueryURL string, grpcProxyStrategy string, - comp component.Component, queryTelemetryDurationQuantiles []float64, queryTelemetrySamplesQuantiles []float64, queryTelemetrySeriesQuantiles []float64, @@ -452,6 +454,7 @@ func runQuery( enforceTenancy bool, tenantLabel string, ) error { + comp := component.Query if alertQueryURL == "" { lastColon := strings.LastIndex(httpBindAddr, ":") if lastColon != -1 { @@ -492,6 +495,17 @@ func runQuery( } } + // Register resolver for the "thanos:///" scheme for endpoint-groups + dns.RegisterGRPCResolver( + dns.NewProvider( + logger, + extprom.WrapRegistererWithPrefix("thanos_query_endpoint_groups_", reg), + dns.ResolverType(dnsSDResolver), + ), + dnsSDInterval, + logger, + ) + dnsEndpointProvider := dns.NewProvider( logger, extprom.WrapRegistererWithPrefix("thanos_query_endpoints_", reg), @@ -527,6 +541,9 @@ func runQuery( store.WithProxyStoreDebugLogging(debugLogging), } + // Parse and sanitize the provided replica labels flags. + queryReplicaLabels = strutil.ParseFlagLabels(queryReplicaLabels) + var ( endpoints = prepareEndpointSet( g, @@ -551,7 +568,8 @@ func runQuery( queryConnMetricLabels..., ) - proxy = store.NewProxyStore(logger, reg, endpoints.GetStoreClients, component.Query, selectorLset, storeResponseTimeout, store.RetrievalStrategy(grpcProxyStrategy), options...) + proxyStore = store.NewProxyStore(logger, reg, endpoints.GetStoreClients, component.Query, selectorLset, storeResponseTimeout, store.RetrievalStrategy(grpcProxyStrategy), options...) + seriesProxy = store.NewLimitedStoreServer(store.NewInstrumentedStoreServer(reg, proxyStore), reg, storeRateLimits) rulesProxy = rules.NewProxy(logger, endpoints.GetRulesClients) targetsProxy = targets.NewProxy(logger, endpoints.GetTargetsClients) metadataProxy = metadata.NewProxy(logger, endpoints.GetMetricMetadataClients) @@ -559,7 +577,7 @@ func runQuery( queryableCreator = query.NewQueryableCreator( logger, extprom.WrapRegistererWithPrefix("thanos_query_", reg), - proxy, + seriesProxy, maxConcurrentSelects, queryTimeout, ) @@ -591,7 +609,7 @@ func runQuery( fileSDCache.Update(update) endpoints.Update(ctxUpdate) - if err := dnsStoreProvider.Resolve(ctxUpdate, append(fileSDCache.Addresses(), storeAddrs...)); err != nil { + if err := dnsStoreProvider.Resolve(ctxUpdate, append(fileSDCache.Addresses(), storeAddrs...), true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses for storeAPIs", "err", err) } @@ -611,22 +629,22 @@ func runQuery( return runutil.Repeat(dnsSDInterval, ctx.Done(), func() error { resolveCtx, resolveCancel := context.WithTimeout(ctx, dnsSDInterval) defer resolveCancel() - if err := dnsStoreProvider.Resolve(resolveCtx, append(fileSDCache.Addresses(), storeAddrs...)); err != nil { + if err := dnsStoreProvider.Resolve(resolveCtx, append(fileSDCache.Addresses(), storeAddrs...), true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses for storeAPIs", "err", err) } - if err := dnsRuleProvider.Resolve(resolveCtx, ruleAddrs); err != nil { + if err := dnsRuleProvider.Resolve(resolveCtx, ruleAddrs, true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses for rulesAPIs", "err", err) } - if err := dnsTargetProvider.Resolve(ctx, targetAddrs); err != nil { + if err := dnsTargetProvider.Resolve(ctx, targetAddrs, true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses for targetsAPIs", "err", err) } - if err := dnsMetadataProvider.Resolve(resolveCtx, metadataAddrs); err != nil { + if err := dnsMetadataProvider.Resolve(resolveCtx, metadataAddrs, true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses for metadataAPIs", "err", err) } - if err := dnsExemplarProvider.Resolve(resolveCtx, exemplarAddrs); err != nil { + if err := dnsExemplarProvider.Resolve(resolveCtx, exemplarAddrs, true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses for exemplarsAPI", "err", err) } - if err := dnsEndpointProvider.Resolve(resolveCtx, endpointAddrs); err != nil { + if err := dnsEndpointProvider.Resolve(resolveCtx, endpointAddrs, true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses passed using endpoint flag", "err", err) } @@ -672,6 +690,7 @@ func runQuery( remoteEngineEndpoints = query.NewRemoteEndpoints(logger, endpoints.GetQueryAPIClients, query.Opts{ AutoDownsample: enableAutodownsampling, ReplicaLabels: queryReplicaLabels, + PartitionLabels: queryPartitionLabels, Timeout: queryTimeout, EnablePartialResponse: enableQueryPartialResponse, }) @@ -775,23 +794,23 @@ func runQuery( } // Start query (proxy) gRPC StoreAPI. { - tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), grpcServerConfig.tlsSrvCert, grpcServerConfig.tlsSrvKey, grpcServerConfig.tlsSrvClientCA) + tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), grpcServerConfig.tlsSrvCert, grpcServerConfig.tlsSrvKey, grpcServerConfig.tlsSrvClientCA, grpcServerConfig.tlsMinVersion) if err != nil { return errors.Wrap(err, "setup gRPC server") } infoSrv := info.NewInfoServer( component.Query.String(), - info.WithLabelSetFunc(func() []labelpb.ZLabelSet { return proxy.LabelSet() }), + info.WithLabelSetFunc(func() []labelpb.ZLabelSet { return proxyStore.LabelSet() }), info.WithStoreInfoFunc(func() (*infopb.StoreInfo, error) { if httpProbe.IsReady() { - mint, maxt := proxy.TimeRange() + mint, maxt := proxyStore.TimeRange() return &infopb.StoreInfo{ MinTime: mint, MaxTime: maxt, SupportsSharding: true, SupportsWithoutReplicaLabels: true, - TsdbInfos: proxy.TSDBInfos(), + TsdbInfos: proxyStore.TSDBInfos(), }, nil } return nil, errors.New("Not ready") @@ -805,10 +824,9 @@ func runQuery( defaultEngineType := querypb.EngineType(querypb.EngineType_value[defaultEngine]) grpcAPI := apiv1.NewGRPCAPI(time.Now, queryReplicaLabels, queryableCreator, engineFactory, defaultEngineType, lookbackDeltaCreator, instantDefaultMaxSourceResolution) - storeServer := store.NewLimitedStoreServer(store.NewInstrumentedStoreServer(reg, proxy), reg, storeRateLimits) - s := grpcserver.New(logger, reg, tracer, grpcLogOpts, tagOpts, comp, grpcProbe, + s := grpcserver.New(logger, reg, tracer, grpcLogOpts, logFilterMethods, comp, grpcProbe, grpcserver.WithServer(apiv1.RegisterQueryServer(grpcAPI)), - grpcserver.WithServer(store.RegisterStoreServer(storeServer, logger)), + grpcserver.WithServer(store.RegisterStoreServer(seriesProxy, logger)), grpcserver.WithServer(rules.RegisterRulesServer(rulesProxy)), grpcserver.WithServer(targets.RegisterTargetsServer(targetsProxy)), grpcserver.WithServer(metadata.RegisterMetadataServer(metadataProxy)), @@ -826,6 +844,7 @@ func runQuery( }, func(error) { statusProber.NotReady(err) s.Shutdown(err) + endpoints.Close() }) } @@ -890,14 +909,12 @@ func prepareEndpointSet( } for _, eg := range endpointGroupAddrs { - addr := fmt.Sprintf("dns:///%s", eg) - spec := query.NewGRPCEndpointSpec(addr, false, extgrpc.EndpointGroupGRPCOpts()...) + spec := query.NewGRPCEndpointSpec(fmt.Sprintf("thanos:///%s", eg), false, extgrpc.EndpointGroupGRPCOpts()...) specs = append(specs, spec) } for _, eg := range strictEndpointGroups { - addr := fmt.Sprintf("dns:///%s", eg) - spec := query.NewGRPCEndpointSpec(addr, true, extgrpc.EndpointGroupGRPCOpts()...) + spec := query.NewGRPCEndpointSpec(fmt.Sprintf("thanos:///%s", eg), true, extgrpc.EndpointGroupGRPCOpts()...) specs = append(specs, spec) } @@ -919,7 +936,6 @@ func prepareEndpointSet( }) }, func(error) { cancel() - endpointSet.Close() }) } diff --git a/cmd/thanos/query_frontend.go b/cmd/thanos/query_frontend.go index 5fa7cf3c5e..0367133cc7 100644 --- a/cmd/thanos/query_frontend.go +++ b/cmd/thanos/query_frontend.go @@ -146,6 +146,8 @@ func registerQueryFrontend(app *extkingpin.App) { cmd.Flag("query-frontend.log-queries-longer-than", "Log queries that are slower than the specified duration. "+ "Set to 0 to disable. Set to < 0 to enable on all queries.").Default("0").DurationVar(&cfg.CortexHandlerConfig.LogQueriesLongerThan) + cmd.Flag("query-frontend.force-query-stats", "Enables query statistics for all queries and will export statistics as logs and service headers.").Default("false").BoolVar(&cfg.CortexHandlerConfig.QueryStatsEnabled) + cmd.Flag("query-frontend.org-id-header", "Deprecation Warning - This flag will be soon deprecated in favor of query-frontend.tenant-header"+ " and both flags cannot be used at the same time. "+ "Request header names used to identify the source of slow queries (repeated flag). "+ @@ -161,6 +163,8 @@ func registerQueryFrontend(app *extkingpin.App) { cmd.Flag("query-frontend.vertical-shards", "Number of shards to use when distributing shardable PromQL queries. For more details, you can refer to the Vertical query sharding proposal: https://thanos.io/tip/proposals-accepted/202205-vertical-query-sharding.md").IntVar(&cfg.NumShards) + cmd.Flag("query-frontend.slow-query-logs-user-header", "Set the value of the field remote_user in the slow query logs to the value of the given HTTP header. Falls back to reading the user from the basic auth header.").PlaceHolder("").Default("").StringVar(&cfg.CortexHandlerConfig.SlowQueryLogsUserHeader) + reqLogConfig := extkingpin.RegisterRequestLoggingFlags(cmd) cmd.Setup(func(g *run.Group, logger log.Logger, reg *prometheus.Registry, tracer opentracing.Tracer, _ <-chan struct{}, _ bool) error { @@ -350,19 +354,17 @@ func runQueryFrontend( if !cfg.webDisableCORS { api.SetCORS(w) } - tracing.HTTPMiddleware( - tracer, - name, - logger, - ins.NewHandler( + middleware.RequestID( + tracing.HTTPMiddleware( + tracer, name, - gzhttp.GzipHandler( - middleware.RequestID( - logMiddleware.HTTPMiddleware(name, f), - ), + logger, + ins.NewHandler( + name, + logMiddleware.HTTPMiddleware(name, f), ), + // Cortex frontend middlewares require orgID. ), - // Cortex frontend middlewares require orgID. ).ServeHTTP(w, r.WithContext(user.InjectOrgID(r.Context(), orgId))) }) return hf diff --git a/cmd/thanos/receive.go b/cmd/thanos/receive.go index 5398820780..fffcf6bbde 100644 --- a/cmd/thanos/receive.go +++ b/cmd/thanos/receive.go @@ -5,6 +5,8 @@ package main import ( "context" + "fmt" + "net" "os" "path" "strings" @@ -15,7 +17,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" grpc_logging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" "github.com/oklog/run" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" @@ -54,7 +55,10 @@ import ( "github.com/thanos-io/thanos/pkg/tls" ) -const compressionNone = "none" +const ( + compressionNone = "none" + metricNamesFilter = "metric-names-filter" +) func registerReceive(app *extkingpin.App) { cmd := app.Command(component.Receive.String(), "Accept Prometheus remote write API requests and write to local tsdb.") @@ -71,11 +75,12 @@ func registerReceive(app *extkingpin.App) { if !model.LabelName.IsValid(model.LabelName(conf.tenantLabelName)) { return errors.Errorf("unsupported format for tenant label name, got %s", conf.tenantLabelName) } - if len(lset) == 0 { + if lset.Len() == 0 { return errors.New("no external labels configured for receive, uniquely identifying external labels must be configured (ideally with `receive_` prefix); see https://thanos.io/tip/thanos/storage.md#external-labels for details.") } - tagOpts, grpcLogOpts, err := logging.ParsegRPCOptions(conf.reqLogConfig) + grpcLogOpts, logFilterMethods, err := logging.ParsegRPCOptions(conf.reqLogConfig) + if err != nil { return errors.Wrap(err, "error while parsing config for request logging") } @@ -105,7 +110,8 @@ func registerReceive(app *extkingpin.App) { debugLogging, reg, tracer, - grpcLogOpts, tagOpts, + grpcLogOpts, + logFilterMethods, tsdbOpts, lset, component.Receive, @@ -123,7 +129,7 @@ func runReceive( reg *prometheus.Registry, tracer opentracing.Tracer, grpcLogOpts []grpc_logging.Option, - tagOpts []tags.Option, + logFilterMethods []string, tsdbOpts *tsdb.Options, lset labels.Labels, comp component.SourceStoreAPI, @@ -135,7 +141,15 @@ func runReceive( level.Info(logger).Log("mode", receiveMode, "msg", "running receive") - rwTLSConfig, err := tls.NewServerConfig(log.With(logger, "protocol", "HTTP"), conf.rwServerCert, conf.rwServerKey, conf.rwServerClientCA) + multiTSDBOptions := []receive.MultiTSDBOption{} + for _, feature := range *conf.featureList { + if feature == metricNamesFilter { + multiTSDBOptions = append(multiTSDBOptions, receive.WithMetricNameFilterEnabled()) + level.Info(logger).Log("msg", "metric name filter feature enabled") + } + } + + rwTLSConfig, err := tls.NewServerConfig(log.With(logger, "protocol", "HTTP"), conf.rwServerCert, conf.rwServerKey, conf.rwServerClientCA, conf.rwServerTlsMinVersion) if err != nil { return err } @@ -179,7 +193,7 @@ func runReceive( } // The background shipper continuously scans the data directory and uploads // new blocks to object storage service. - bkt, err = client.NewBucket(logger, confContentYaml, comp.String()) + bkt, err = client.NewBucket(logger, confContentYaml, comp.String(), nil) if err != nil { return err } @@ -214,6 +228,7 @@ func runReceive( bkt, conf.allowOutOfOrderUpload, hashFunc, + multiTSDBOptions..., ) writer := receive.NewWriter(log.With(logger, "component", "receive-writer"), dbs, &receive.WriterOptions{ Intern: conf.writerInterning, @@ -258,6 +273,7 @@ func runReceive( Limiter: limiter, AsyncForwardWorkerCount: conf.asyncForwardWorkerCount, + ReplicationProtocol: receive.ReplicationProtocol(conf.replicationProtocol), }) grpcProbe := prober.NewGRPC() @@ -315,13 +331,14 @@ func runReceive( level.Debug(logger).Log("msg", "setting up gRPC server") { - tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), conf.grpcConfig.tlsSrvCert, conf.grpcConfig.tlsSrvKey, conf.grpcConfig.tlsSrvClientCA) + tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), conf.grpcConfig.tlsSrvCert, conf.grpcConfig.tlsSrvKey, conf.grpcConfig.tlsSrvClientCA, conf.grpcConfig.tlsMinVersion) if err != nil { return errors.Wrap(err, "setup gRPC server") } options := []store.ProxyStoreOption{ store.WithProxyStoreDebugLogging(debugLogging), + store.WithoutDedup(), } proxy := store.NewProxyStore( @@ -359,7 +376,7 @@ func runReceive( info.WithExemplarsInfoFunc(), ) - srv := grpcserver.New(logger, receive.NewUnRegisterer(reg), tracer, grpcLogOpts, tagOpts, comp, grpcProbe, + srv := grpcserver.New(logger, receive.NewUnRegisterer(reg), tracer, grpcLogOpts, logFilterMethods, comp, grpcProbe, grpcserver.WithServer(store.RegisterStoreServer(rw, logger)), grpcserver.WithServer(store.RegisterWritableStoreServer(rw)), grpcserver.WithServer(exemplars.RegisterExemplarsServer(exemplars.NewMultiTSDB(dbs.TSDBExemplars))), @@ -418,7 +435,13 @@ func runReceive( { ctx, cancel := context.WithCancel(context.Background()) g.Add(func() error { - return runutil.Repeat(2*time.Hour, ctx.Done(), func() error { + pruneInterval := 2 * time.Duration(tsdbOpts.MaxBlockDuration) * time.Millisecond + return runutil.Repeat(time.Minute, ctx.Done(), func() error { + currentTime := time.Now() + currentTotalMinutes := currentTime.Hour()*60 + currentTime.Minute() + if currentTotalMinutes%int(pruneInterval.Minutes()) != 0 { + return nil + } if err := dbs.Prune(ctx); err != nil { level.Error(logger).Log("err", err) } @@ -445,6 +468,26 @@ func runReceive( } } + { + capNProtoWriter := receive.NewCapNProtoWriter(logger, dbs, &receive.CapNProtoWriterOptions{ + TooFarInFutureTimeWindow: int64(time.Duration(*conf.tsdbTooFarInFutureTimeWindow)), + }) + handler := receive.NewCapNProtoHandler(logger, capNProtoWriter) + listener, err := net.Listen("tcp", conf.replicationAddr) + if err != nil { + return err + } + server := receive.NewCapNProtoServer(listener, handler, logger) + g.Add(func() error { + return server.ListenAndServe() + }, func(err error) { + server.Shutdown() + if err := listener.Close(); err != nil { + level.Warn(logger).Log("msg", "Cap'n Proto server did not shut down gracefully", "err", err.Error()) + } + }) + } + level.Info(logger).Log("msg", "starting receiver") return nil } @@ -775,16 +818,18 @@ type receiveConfig struct { grpcConfig grpcConfig - rwAddress string - rwServerCert string - rwServerKey string - rwServerClientCA string - rwClientCert string - rwClientKey string - rwClientSecure bool - rwClientServerCA string - rwClientServerName string - rwClientSkipVerify bool + replicationAddr string + rwAddress string + rwServerCert string + rwServerKey string + rwServerClientCA string + rwClientCert string + rwClientKey string + rwClientSecure bool + rwClientServerCA string + rwClientServerName string + rwClientSkipVerify bool + rwServerTlsMinVersion string dataDir string labelStrs []string @@ -796,17 +841,18 @@ type receiveConfig struct { hashringsFileContent string hashringsAlgorithm string - refreshInterval *model.Duration - endpoint string - tenantHeader string - tenantField string - tenantLabelName string - defaultTenantID string - replicaHeader string - replicationFactor uint64 - forwardTimeout *model.Duration - maxBackoff *model.Duration - compression string + refreshInterval *model.Duration + endpoint string + tenantHeader string + tenantField string + tenantLabelName string + defaultTenantID string + replicaHeader string + replicationFactor uint64 + forwardTimeout *model.Duration + maxBackoff *model.Duration + compression string + replicationProtocol string tsdbMinBlockDuration *model.Duration tsdbMaxBlockDuration *model.Duration @@ -838,6 +884,8 @@ type receiveConfig struct { limitsConfigReloadTimer time.Duration asyncForwardWorkerCount uint + + featureList *[]string } func (rc *receiveConfig) registerFlag(cmd extkingpin.FlagClause) { @@ -854,6 +902,8 @@ func (rc *receiveConfig) registerFlag(cmd extkingpin.FlagClause) { cmd.Flag("remote-write.server-tls-client-ca", "TLS CA to verify clients against. If no client CA is specified, there is no client verification on server side. (tls.NoClientCert)").Default("").StringVar(&rc.rwServerClientCA) + cmd.Flag("remote-write.server-tls-min-version", "TLS version for the gRPC server, leave blank to default to TLS 1.3, allow values: [\"1.0\", \"1.1\", \"1.2\", \"1.3\"]").Default("1.3").StringVar(&rc.rwServerTlsMinVersion) + cmd.Flag("remote-write.client-tls-cert", "TLS Certificates to use to identify this client to the server.").Default("").StringVar(&rc.rwClientCert) cmd.Flag("remote-write.client-tls-key", "TLS Key for the client's certificate.").Default("").StringVar(&rc.rwClientKey) @@ -907,6 +957,13 @@ func (rc *receiveConfig) registerFlag(cmd extkingpin.FlagClause) { cmd.Flag("receive.replication-factor", "How many times to replicate incoming write requests.").Default("1").Uint64Var(&rc.replicationFactor) + replicationProtocols := []string{string(receive.ProtobufReplication), string(receive.CapNProtoReplication)} + cmd.Flag("receive.replication-protocol", "The protocol to use for replicating remote-write requests. One of "+strings.Join(replicationProtocols, ", ")). + Default(string(receive.ProtobufReplication)). + EnumVar(&rc.replicationProtocol, replicationProtocols...) + + cmd.Flag("receive.capnproto-address", "Address for the Cap'n Proto server.").Default(fmt.Sprintf("0.0.0.0:%s", receive.DefaultCapNProtoPort)).StringVar(&rc.replicationAddr) + rc.forwardTimeout = extkingpin.ModelDuration(cmd.Flag("receive-forward-timeout", "Timeout for each forward request.").Default("5s").Hidden()) rc.maxBackoff = extkingpin.ModelDuration(cmd.Flag("receive-forward-max-backoff", "Maximum backoff for each forward fan-out request").Default("5s").Hidden()) @@ -918,7 +975,7 @@ func (rc *receiveConfig) registerFlag(cmd extkingpin.FlagClause) { rc.tsdbMaxBlockDuration = extkingpin.ModelDuration(cmd.Flag("tsdb.max-block-duration", "Max duration for local TSDB blocks").Default("2h").Hidden()) rc.tsdbTooFarInFutureTimeWindow = extkingpin.ModelDuration(cmd.Flag("tsdb.too-far-in-future.time-window", - "[EXPERIMENTAL] Configures the allowed time window for ingesting samples too far in the future. Disabled (0s) by default"+ + "Configures the allowed time window for ingesting samples too far in the future. Disabled (0s) by default"+ "Please note enable this flag will reject samples in the future of receive local NTP time + configured duration due to clock skew in remote write clients.", ).Default("0s")) @@ -978,6 +1035,8 @@ func (rc *receiveConfig) registerFlag(cmd extkingpin.FlagClause) { rc.writeLimitsConfig = extflag.RegisterPathOrContent(cmd, "receive.limits-config", "YAML file that contains limit configuration.", extflag.WithEnvSubstitution(), extflag.WithHidden()) cmd.Flag("receive.limits-config-reload-timer", "Minimum amount of time to pass for the limit configuration to be reloaded. Helps to avoid excessive reloads."). Default("1s").Hidden().DurationVar(&rc.limitsConfigReloadTimer) + + rc.featureList = cmd.Flag("enable-feature", "Comma separated experimental feature names to enable. The current list of features is "+metricNamesFilter+".").Default("").Strings() } // determineMode returns the ReceiverMode that this receiver is configured to run in. diff --git a/cmd/thanos/rule.go b/cmd/thanos/rule.go index 4b89989bac..a8d4b1c419 100644 --- a/cmd/thanos/rule.go +++ b/cmd/thanos/rule.go @@ -21,7 +21,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" grpc_logging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" "github.com/oklog/run" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" @@ -41,12 +40,12 @@ import ( "github.com/prometheus/prometheus/tsdb" "github.com/prometheus/prometheus/tsdb/agent" "github.com/prometheus/prometheus/tsdb/wlog" + "gopkg.in/yaml.v2" "github.com/thanos-io/objstore" "github.com/thanos-io/objstore/client" objstoretracing "github.com/thanos-io/objstore/tracing/opentracing" "github.com/thanos-io/promql-engine/execution/parse" - "gopkg.in/yaml.v2" "github.com/thanos-io/thanos/pkg/alert" v1 "github.com/thanos-io/thanos/pkg/api/rule" @@ -55,10 +54,12 @@ import ( "github.com/thanos-io/thanos/pkg/component" "github.com/thanos-io/thanos/pkg/discovery/dns" "github.com/thanos-io/thanos/pkg/errutil" + "github.com/thanos-io/thanos/pkg/extannotations" "github.com/thanos-io/thanos/pkg/extgrpc" "github.com/thanos-io/thanos/pkg/extkingpin" "github.com/thanos-io/thanos/pkg/extprom" extpromhttp "github.com/thanos-io/thanos/pkg/extprom/http" + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/info" "github.com/thanos-io/thanos/pkg/info/infopb" "github.com/thanos-io/thanos/pkg/logging" @@ -97,16 +98,17 @@ type ruleConfig struct { rwConfig *extflag.PathOrContent - resendDelay time.Duration - evalInterval time.Duration - outageTolerance time.Duration - forGracePeriod time.Duration - ruleFiles []string - objStoreConfig *extflag.PathOrContent - dataDir string - lset labels.Labels - ignoredLabelNames []string - storeRateLimits store.SeriesSelectLimits + resendDelay time.Duration + evalInterval time.Duration + outageTolerance time.Duration + forGracePeriod time.Duration + ruleFiles []string + objStoreConfig *extflag.PathOrContent + dataDir string + lset labels.Labels + ignoredLabelNames []string + storeRateLimits store.SeriesSelectLimits + ruleConcurrentEval int64 extendedFunctionsEnabled bool } @@ -155,13 +157,15 @@ func registerRule(app *extkingpin.App) { Default("10m").DurationVar(&conf.forGracePeriod) cmd.Flag("restore-ignored-label", "Label names to be ignored when restoring alerts from the remote storage. This is only used in stateless mode."). StringsVar(&conf.ignoredLabelNames) + cmd.Flag("rule-concurrent-evaluation", "How many rules can be evaluated concurrently. Default is 1.").Default("1").Int64Var(&conf.ruleConcurrentEval) cmd.Flag("grpc-query-endpoint", "Addresses of Thanos gRPC query API servers (repeatable). The scheme may be prefixed with 'dns+' or 'dnssrv+' to detect Thanos API servers through respective DNS lookups."). PlaceHolder("").StringsVar(&conf.grpcQueryEndpoints) cmd.Flag("query.enable-x-functions", "Whether to enable extended rate functions (xrate, xincrease and xdelta). Only has effect when used with Thanos engine.").Default("false").BoolVar(&conf.extendedFunctionsEnabled) - conf.rwConfig = extflag.RegisterPathOrContent(cmd, "remote-write.config", "YAML config for the remote-write configurations, that specify servers where samples should be sent to (see https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write). This automatically enables stateless mode for ruler and no series will be stored in the ruler's TSDB. If an empty config (or file) is provided, the flag is ignored and ruler is run with its own TSDB.", extflag.WithEnvSubstitution()) + cmd.Flag("grpc-query-endpoint", "Addresses of Thanos gRPC query API servers (repeatable). The scheme may be prefixed with 'dns+' or 'dnssrv+' to detect Thanos API servers through respective DNS lookups."). + PlaceHolder("").StringsVar(&conf.grpcQueryEndpoints) conf.objStoreConfig = extkingpin.RegisterCommonObjStoreFlags(cmd, "", false) @@ -233,7 +237,8 @@ func registerRule(app *extkingpin.App) { return errors.Wrap(err, "error while parsing config for request logging") } - tagOpts, grpcLogOpts, err := logging.ParsegRPCOptions(reqLogConfig) + grpcLogOpts, logFilterMethods, err := logging.ParsegRPCOptions(reqLogConfig) + if err != nil { return errors.Wrap(err, "error while parsing config for request logging") } @@ -249,7 +254,7 @@ func registerRule(app *extkingpin.App) { getFlagsMap(cmd.Flags()), httpLogOpts, grpcLogOpts, - tagOpts, + logFilterMethods, tsdbOpts, agentOpts, ) @@ -291,7 +296,7 @@ func newRuleMetrics(reg *prometheus.Registry) *RuleMetrics { m.ruleEvalWarnings = factory.NewCounterVec( prometheus.CounterOpts{ Name: "thanos_rule_evaluation_with_warnings_total", - Help: "The total number of rule evaluation that were successful but had warnings which can indicate partial error.", + Help: "The total number of rule evaluation that were successful but had non PromQL warnings which can indicate partial error.", }, []string{"strategy"}, ) m.ruleEvalWarnings.WithLabelValues(strings.ToLower(storepb.PartialResponseStrategy_ABORT.String())) @@ -313,7 +318,7 @@ func runRule( flagsMap map[string]string, httpLogOpts []logging.Option, grpcLogOpts []grpc_logging.Option, - tagOpts []tags.Option, + logFilterMethods []string, tsdbOpts *tsdb.Options, agentOpts *agent.Options, ) error { @@ -324,7 +329,7 @@ func runRule( if len(conf.queryConfigYAML) > 0 { queryCfg, err = clientconfig.LoadConfigs(conf.queryConfigYAML) if err != nil { - return err + return errors.Wrap(err, "query configuration") } } else { queryCfg, err = clientconfig.BuildConfigFromHTTPAddresses(conf.query.addrs) @@ -381,12 +386,12 @@ func runRule( cfg.HTTPConfig.HTTPClientConfig.ClientMetrics = queryClientMetrics c, err := clientconfig.NewHTTPClient(cfg.HTTPConfig.HTTPClientConfig, "query") if err != nil { - return err + return fmt.Errorf("failed to create HTTP query client: %w", err) } c.Transport = tracing.HTTPTripperware(logger, c.Transport) queryClient, err := clientconfig.NewClient(logger, cfg.HTTPConfig.EndpointsConfig, c, queryProvider.Clone()) if err != nil { - return err + return fmt.Errorf("failed to create query client: %w", err) } queryClients = append(queryClients, queryClient) promClients = append(promClients, promclient.NewClient(queryClient, logger, "thanos-rule")) @@ -448,7 +453,7 @@ func runRule( return runutil.Repeat(5*time.Second, ctx.Done(), func() error { resolveCtx, resolveCancel := context.WithTimeout(ctx, 5*time.Second) defer resolveCancel() - if err := dnsEndpointProvider.Resolve(resolveCtx, grpcEndpoints); err != nil { + if err := dnsEndpointProvider.Resolve(resolveCtx, grpcEndpoints, true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses passed using grpc query config", "err", err) } return nil @@ -482,7 +487,7 @@ func runRule( // flushDeadline is set to 1m, but it is for metadata watcher only so not used here. remoteStore := remote.NewStorage(logger, reg, func() (int64, error) { return 0, nil - }, conf.dataDir, 1*time.Minute, nil) + }, conf.dataDir, 1*time.Minute, nil, false) if err := remoteStore.ApplyConfig(&config.Config{ GlobalConfig: config.GlobalConfig{ ExternalLabels: labelsTSDBToProm(conf.lset), @@ -622,22 +627,28 @@ func runRule( alertQ.Push(res) } + managerOpts := rules.ManagerOptions{ + NotifyFunc: notifyFunc, + Logger: logger, + Appendable: appendable, + ExternalURL: nil, + Queryable: queryable, + ResendDelay: conf.resendDelay, + OutageTolerance: conf.outageTolerance, + ForGracePeriod: conf.forGracePeriod, + } + if conf.ruleConcurrentEval > 1 { + managerOpts.MaxConcurrentEvals = conf.ruleConcurrentEval + managerOpts.ConcurrentEvalsEnabled = true + } + ctx, cancel := context.WithCancel(context.Background()) logger = log.With(logger, "component", "rules") ruleMgr = thanosrules.NewManager( tracing.ContextWithTracer(ctx, tracer), reg, conf.dataDir, - rules.ManagerOptions{ - NotifyFunc: notifyFunc, - Logger: logger, - Appendable: appendable, - ExternalURL: nil, - Queryable: queryable, - ResendDelay: conf.resendDelay, - OutageTolerance: conf.outageTolerance, - ForGracePeriod: conf.forGracePeriod, - }, + managerOpts, queryFuncCreator(logger, queryClients, promClients, grpcEndpointSet, metrics.duplicatedQuery, metrics.ruleEvalWarnings, conf.query.httpMethod, conf.query.doNotAddThanosParams), conf.lset, // In our case the querying URL is the external URL because in Prometheus @@ -720,7 +731,7 @@ func runRule( ) // Start gRPC server. - tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), conf.grpc.tlsSrvCert, conf.grpc.tlsSrvKey, conf.grpc.tlsSrvClientCA) + tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), conf.grpc.tlsSrvCert, conf.grpc.tlsSrvKey, conf.grpc.tlsSrvClientCA, conf.grpc.tlsMinVersion) if err != nil { return errors.Wrap(err, "setup gRPC server") } @@ -761,7 +772,7 @@ func runRule( options = append(options, grpcserver.WithServer( info.RegisterInfoServer(info.NewInfoServer(component.Rule.String(), infoOptions...)), )) - s := grpcserver.New(logger, reg, tracer, grpcLogOpts, tagOpts, comp, grpcProbe, options...) + s := grpcserver.New(logger, reg, tracer, grpcLogOpts, logFilterMethods, comp, grpcProbe, options...) g.Add(func() error { statusProber.Ready() @@ -832,7 +843,7 @@ func runRule( if len(confContentYaml) > 0 { // The background shipper continuously scans the data directory and uploads // new blocks to Google Cloud Storage or an S3-compatible storage service. - bkt, err := client.NewBucket(logger, confContentYaml, component.Rule.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Rule.String(), nil) if err != nil { return err } @@ -885,13 +896,7 @@ func removeLockfileIfAny(logger log.Logger, dataDir string) error { } func labelsTSDBToProm(lset labels.Labels) (res labels.Labels) { - for _, l := range lset { - res = append(res, labels.Label{ - Name: l.Name, - Value: l.Value, - }) - } - return res + return lset.Copy() } func queryFuncCreator( @@ -938,6 +943,8 @@ func queryFuncCreator( level.Error(logger).Log("err", err, "query", qs) continue } + + warns = filterOutPromQLWarnings(warns, logger, qs) if len(warns) > 0 { ruleEvalWarnings.WithLabelValues(strings.ToLower(partialResponseStrategy.String())).Inc() // TODO(bwplotka): Propagate those to UI, probably requires changing rule manager code ): @@ -951,7 +958,7 @@ func queryFuncCreator( queryAPIClients := grpcEndpointSet.GetQueryAPIClients() for _, i := range rand.Perm(len(queryAPIClients)) { e := query.NewRemoteEngine(logger, queryAPIClients[i], query.Opts{}) - expr, err := parser.ParseExpr(qs) + expr, err := extpromql.ParseExpr(qs) if err != nil { level.Error(logger).Log("err", err, "query", qs) continue @@ -969,12 +976,13 @@ func queryFuncCreator( continue } - if len(result.Warnings) > 0 { + warnings := make([]string, 0, len(result.Warnings)) + for _, warn := range result.Warnings { + warnings = append(warnings, warn.Error()) + } + warnings = filterOutPromQLWarnings(warnings, logger, qs) + if len(warnings) > 0 { ruleEvalWarnings.WithLabelValues(strings.ToLower(partialResponseStrategy.String())).Inc() - warnings := make([]string, 0, len(result.Warnings)) - for _, w := range result.Warnings { - warnings = append(warnings, w.Error()) - } level.Warn(logger).Log("warnings", strings.Join(warnings, ", "), "query", qs) } @@ -1080,3 +1088,16 @@ func validateTemplate(tmplStr string) error { } return nil } + +// Filter out PromQL related warnings from warning response and keep store related warnings only. +func filterOutPromQLWarnings(warns []string, logger log.Logger, query string) []string { + storeWarnings := make([]string, 0, len(warns)) + for _, warn := range warns { + if extannotations.IsPromQLAnnotation(warn) { + level.Warn(logger).Log("warning", warn, "query", query) + continue + } + storeWarnings = append(storeWarnings, warn) + } + return storeWarnings +} diff --git a/cmd/thanos/rule_test.go b/cmd/thanos/rule_test.go index 097b66e65b..bc6192ca8d 100644 --- a/cmd/thanos/rule_test.go +++ b/cmd/thanos/rule_test.go @@ -7,6 +7,10 @@ import ( "testing" "github.com/efficientgo/core/testutil" + "github.com/go-kit/log" + "github.com/prometheus/prometheus/util/annotations" + + "github.com/thanos-io/thanos/pkg/extpromql" ) func Test_parseFlagLabels(t *testing.T) { @@ -31,7 +35,7 @@ func Test_parseFlagLabels(t *testing.T) { expectErr: true, }, { - s: []string{`label_Name"LabelVal"`}, // Missing "=" seprator. + s: []string{`label_Name"LabelVal"`}, // Missing "=" separator. expectErr: true, }, { @@ -110,3 +114,59 @@ func Test_tableLinkForExpression(t *testing.T) { testutil.Equals(t, resStr, td.expectStr) } } + +func TestFilterOutPromQLWarnings(t *testing.T) { + logger := log.NewNopLogger() + query := "foo" + expr, err := extpromql.ParseExpr(`rate(prometheus_build_info[5m])`) + testutil.Ok(t, err) + possibleCounterInfo := annotations.NewPossibleNonCounterInfo("foo", expr.PositionRange()) + badBucketLabelWarning := annotations.NewBadBucketLabelWarning("foo", "0.99", expr.PositionRange()) + for _, tc := range []struct { + name string + warnings []string + expected []string + }{ + { + name: "nil warning", + expected: make([]string, 0), + }, + { + name: "empty warning", + warnings: make([]string, 0), + expected: make([]string, 0), + }, + { + name: "no PromQL warning", + warnings: []string{ + "some_warning_message", + }, + expected: []string{ + "some_warning_message", + }, + }, + { + name: "PromQL warning", + warnings: []string{ + possibleCounterInfo.Error(), + }, + expected: make([]string, 0), + }, + { + name: "filter out all PromQL warnings", + warnings: []string{ + possibleCounterInfo.Error(), + badBucketLabelWarning.Error(), + "some_warning_message", + }, + expected: []string{ + "some_warning_message", + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + output := filterOutPromQLWarnings(tc.warnings, logger, query) + testutil.Equals(t, tc.expected, output) + }) + } +} diff --git a/cmd/thanos/sidecar.go b/cmd/thanos/sidecar.go index 95ad4ba693..5ff89e7d2f 100644 --- a/cmd/thanos/sidecar.go +++ b/cmd/thanos/sidecar.go @@ -16,7 +16,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" grpc_logging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" "github.com/oklog/run" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" @@ -59,7 +58,9 @@ func registerSidecar(app *extkingpin.App) { conf := &sidecarConfig{} conf.registerFlag(cmd) cmd.Setup(func(g *run.Group, logger log.Logger, reg *prometheus.Registry, tracer opentracing.Tracer, _ <-chan struct{}, _ bool) error { - tagOpts, grpcLogOpts, err := logging.ParsegRPCOptions(conf.reqLogConfig) + + grpcLogOpts, logFilterMethods, err := logging.ParsegRPCOptions(conf.reqLogConfig) + if err != nil { return errors.Wrap(err, "error while parsing config for request logging") } @@ -101,7 +102,7 @@ func registerSidecar(app *extkingpin.App) { extprom.WrapRegistererWithPrefix("thanos_sidecar_", reg), &opts) - return runSidecar(g, logger, reg, tracer, rl, component.Sidecar, *conf, httpClient, grpcLogOpts, tagOpts) + return runSidecar(g, logger, reg, tracer, rl, component.Sidecar, *conf, httpClient, grpcLogOpts, logFilterMethods) }) } @@ -115,7 +116,7 @@ func runSidecar( conf sidecarConfig, httpClient *http.Client, grpcLogOpts []grpc_logging.Option, - tagOpts []tags.Option, + logFilterMethods []string, ) error { var m = &promMetadata{ @@ -134,10 +135,9 @@ func runSidecar( return errors.Wrap(err, "getting object store config") } - var uploads = true - if len(confContentYaml) == 0 { + var uploads = len(confContentYaml) != 0 + if !uploads { level.Info(logger).Log("msg", "no supported bucket was configured, uploads will be disabled") - uploads = false } grpcProbe := prober.NewGRPC() @@ -148,24 +148,31 @@ func runSidecar( prober.NewInstrumentation(comp, logger, extprom.WrapRegistererWithPrefix("thanos_", reg)), ) - srv := httpserver.New(logger, reg, comp, httpProbe, - httpserver.WithListen(conf.http.bindAddress), - httpserver.WithGracePeriod(time.Duration(conf.http.gracePeriod)), - httpserver.WithTLSConfig(conf.http.tlsConfig), - ) + // Setup the HTTP server. + { + srv := httpserver.New(logger, reg, comp, httpProbe, + httpserver.WithListen(conf.http.bindAddress), + httpserver.WithGracePeriod(time.Duration(conf.http.gracePeriod)), + httpserver.WithTLSConfig(conf.http.tlsConfig), + ) - g.Add(func() error { - statusProber.Healthy() + g.Add(func() error { + statusProber.Healthy() + return srv.ListenAndServe() + }, func(err error) { - return srv.ListenAndServe() - }, func(err error) { - statusProber.NotReady(err) - defer statusProber.NotHealthy(err) + statusProber.NotReady(err) + defer statusProber.NotHealthy(err) - srv.Shutdown(err) - }) + srv.Shutdown(err) + }) + } - // Setup all the concurrent groups. + // Once we have loaded external labels from prometheus we can use this to signal the servers + // that they can start now. + readyToStartGRPC := make(chan struct{}) + + // Setup Prometheus Heartbeats. { promUp := promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "thanos_sidecar_prometheus_up", @@ -253,27 +260,122 @@ func runSidecar( ctx, cancel := context.WithCancel(context.Background()) g.Add(func() error { + // Only check Prometheus's flags when upload is enabled. + if uploads { + // Check prometheus's flags to ensure same sidecar flags. + // We retry infinitely until we validated prometheus flags + err := runutil.Retry(conf.prometheus.getConfigInterval, ctx.Done(), func() error { + iterCtx, iterCancel := context.WithTimeout(context.Background(), conf.prometheus.getConfigTimeout) + defer iterCancel() + + if err := validatePrometheus(iterCtx, m.client, logger, conf.shipper.ignoreBlockSize, m); err != nil { + level.Warn(logger).Log( + "msg", "failed to validate prometheus flags. Is Prometheus running? Retrying", + "err", err, + ) + return err + } + + level.Info(logger).Log( + "msg", "successfully validated prometheus flags", + ) + return nil + }) + if err != nil { + return errors.Wrap(err, "failed to validate prometheus flags") + } + } + + // We retry infinitely until we reach and fetch BuildVersion from our Prometheus. + err := runutil.Retry(conf.prometheus.getConfigInterval, ctx.Done(), func() error { + iterCtx, iterCancel := context.WithTimeout(context.Background(), conf.prometheus.getConfigTimeout) + defer iterCancel() + + if err := m.BuildVersion(iterCtx); err != nil { + level.Warn(logger).Log( + "msg", "failed to fetch prometheus version. Is Prometheus running? Retrying", + "err", err, + ) + return err + } + + level.Info(logger).Log( + "msg", "successfully loaded prometheus version", + ) + return nil + }) + if err != nil { + return errors.Wrap(err, "failed to get prometheus version") + } + + // Blocking query of external labels before joining as a Source Peer into gossip. + // We retry infinitely until we reach and fetch labels from our Prometheus. + err = runutil.Retry(conf.prometheus.getConfigInterval, ctx.Done(), func() error { + iterCtx, iterCancel := context.WithTimeout(context.Background(), conf.prometheus.getConfigTimeout) + defer iterCancel() + + if err := m.UpdateTimestamps(iterCtx); err != nil { + level.Warn(logger).Log( + "msg", "failed to fetch timestamps. Is Prometheus running? Retrying", + "err", err, + ) + return err + } + + if err := m.UpdateLabels(iterCtx); err != nil { + level.Warn(logger).Log( + "msg", "failed to fetch initial external labels. Is Prometheus running? Retrying", + "err", err, + ) + return err + } + + level.Info(logger).Log( + "msg", "successfully loaded prometheus external labels", + "external_labels", m.Labels().String(), + ) + return nil + }) + if err != nil { + return errors.Wrap(err, "initial external labels query") + } + + if m.Labels().Len() == 0 { + return errors.New("no external labels configured on Prometheus server, uniquely identifying external labels must be configured; see https://thanos.io/tip/thanos/storage.md#external-labels for details.") + } + promUp.Set(1) + statusProber.Ready() + + close(readyToStartGRPC) + // Periodically query the Prometheus config. We use this as a heartbeat as well as for updating // the external labels we apply. return runutil.Repeat(conf.prometheus.getConfigInterval, ctx.Done(), func() error { iterCtx, iterCancel := context.WithTimeout(context.Background(), conf.prometheus.getConfigTimeout) defer iterCancel() + if err := m.UpdateTimestamps(iterCtx); err != nil { + level.Warn(logger).Log("msg", "updating timestamps failed", "err", err) + promUp.Set(0) + statusProber.NotReady(err) + return nil + } if err := m.UpdateLabels(iterCtx); err != nil { - level.Warn(logger).Log("msg", "heartbeat failed", "err", err) + level.Warn(logger).Log("msg", "updating labels failed", "err", err) promUp.Set(0) statusProber.NotReady(err) - } else { - promUp.Set(1) - statusProber.Ready() + return nil } - + promUp.Set(1) + statusProber.Ready() return nil }) }, func(error) { cancel() }) } + + // Setup the Reloader. { ctx, cancel := context.WithCancel(context.Background()) g.Add(func() error { @@ -282,6 +384,8 @@ func runSidecar( cancel() }) } + + // Setup the gRPC server. { c := promclient.NewWithTracingClient(logger, httpClient, clientconfig.ThanosUserAgent) @@ -291,7 +395,7 @@ func runSidecar( } tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), - conf.grpc.tlsSrvCert, conf.grpc.tlsSrvKey, conf.grpc.tlsSrvClientCA) + conf.grpc.tlsSrvCert, conf.grpc.tlsSrvKey, conf.grpc.tlsSrvClientCA, conf.grpc.tlsMinVersion) if err != nil { return errors.Wrap(err, "setup gRPC server") } @@ -305,7 +409,7 @@ func runSidecar( }), info.WithStoreInfoFunc(func() (*infopb.StoreInfo, error) { if httpProbe.IsReady() { - mint, maxt := promStore.Timestamps() + mint, maxt := m.Timestamps() return &infopb.StoreInfo{ MinTime: mint, MaxTime: maxt, @@ -323,7 +427,7 @@ func runSidecar( ) storeServer := store.NewLimitedStoreServer(store.NewInstrumentedStoreServer(reg, promStore), reg, conf.storeRateLimits) - s := grpcserver.New(logger, reg, tracer, grpcLogOpts, tagOpts, comp, grpcProbe, + s := grpcserver.New(logger, reg, tracer, grpcLogOpts, logFilterMethods, comp, grpcProbe, grpcserver.WithServer(store.RegisterStoreServer(storeServer, logger)), grpcserver.WithServer(rules.RegisterRulesServer(rules.NewPrometheus(conf.prometheus.url, c, m.Labels))), grpcserver.WithServer(targets.RegisterTargetsServer(targets.NewPrometheus(conf.prometheus.url, c, m.Labels))), @@ -335,19 +439,27 @@ func runSidecar( grpcserver.WithMaxConnAge(conf.grpc.maxConnectionAge), grpcserver.WithTLSConfig(tlsCfg), ) + + ctx, cancel := context.WithCancel(context.Background()) g.Add(func() error { + select { + case <-ctx.Done(): + return ctx.Err() + case <-readyToStartGRPC: + } + statusProber.Ready() return s.ListenAndServe() }, func(err error) { + cancel() statusProber.NotReady(err) s.Shutdown(err) }) } - if uploads { // The background shipper continuously scans the data directory and uploads // new blocks to Google Cloud Storage or an S3-compatible storage service. - bkt, err := client.NewBucket(logger, confContentYaml, component.Sidecar.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Sidecar.String(), nil) if err != nil { return err } @@ -373,7 +485,7 @@ func runSidecar( defer cancel() if err := runutil.Retry(2*time.Second, extLabelsCtx.Done(), func() error { - if len(m.Labels()) == 0 { + if m.Labels().Len() == 0 { return errors.New("not uploading as no external labels are configured yet - is Prometheus healthy/reachable?") } return nil @@ -389,13 +501,6 @@ func runSidecar( if uploaded, err := s.Sync(ctx); err != nil { level.Warn(logger).Log("err", err, "uploaded", uploaded) } - - minTime, _, err := s.Timestamps() - if err != nil { - level.Warn(logger).Log("msg", "reading timestamps failed", "err", err) - return nil - } - m.UpdateTimestamps(minTime, math.MaxInt64) return nil }) }, func(error) { @@ -470,16 +575,19 @@ func (s *promMetadata) UpdateLabels(ctx context.Context) error { return nil } -func (s *promMetadata) UpdateTimestamps(mint, maxt int64) { +func (s *promMetadata) UpdateTimestamps(ctx context.Context) error { s.mtx.Lock() defer s.mtx.Unlock() - if mint < s.limitMinTime.PrometheusTimestamp() { - mint = s.limitMinTime.PrometheusTimestamp() + mint, err := s.client.LowestTimestamp(ctx, s.promURL) + if err != nil { + return err } - s.mint = mint - s.maxt = maxt + s.mint = max(s.limitMinTime.PrometheusTimestamp(), mint) + s.maxt = math.MaxInt64 + + return nil } func (s *promMetadata) Labels() labels.Labels { diff --git a/cmd/thanos/store.go b/cmd/thanos/store.go index 6c752ce15d..795c108cd3 100644 --- a/cmd/thanos/store.go +++ b/cmd/thanos/store.go @@ -15,13 +15,13 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" grpclogging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" "github.com/oklog/run" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" commonmodel "github.com/prometheus/common/model" "github.com/prometheus/common/route" + "gopkg.in/yaml.v2" "github.com/thanos-io/objstore" "github.com/thanos-io/objstore/client" @@ -33,6 +33,7 @@ import ( "github.com/thanos-io/thanos/pkg/block/metadata" "github.com/thanos-io/thanos/pkg/component" hidden "github.com/thanos-io/thanos/pkg/extflag" + "github.com/thanos-io/thanos/pkg/exthttp" "github.com/thanos-io/thanos/pkg/extkingpin" "github.com/thanos-io/thanos/pkg/extprom" extpromhttp "github.com/thanos-io/thanos/pkg/extprom/http" @@ -45,6 +46,7 @@ import ( "github.com/thanos-io/thanos/pkg/runutil" grpcserver "github.com/thanos-io/thanos/pkg/server/grpc" httpserver "github.com/thanos-io/thanos/pkg/server/http" + "github.com/thanos-io/thanos/pkg/server/http/middleware" "github.com/thanos-io/thanos/pkg/store" storecache "github.com/thanos-io/thanos/pkg/store/cache" "github.com/thanos-io/thanos/pkg/store/labelpb" @@ -240,7 +242,8 @@ func registerStore(app *extkingpin.App) { return errors.Wrap(err, "error while parsing config for request logging") } - tagOpts, grpcLogOpts, err := logging.ParsegRPCOptions(conf.reqLogConfig) + grpcLogOpts, logFilterMethods, err := logging.ParsegRPCOptions(conf.reqLogConfig) + if err != nil { return errors.Wrap(err, "error while parsing config for request logging") } @@ -253,7 +256,7 @@ func registerStore(app *extkingpin.App) { tracer, httpLogOpts, grpcLogOpts, - tagOpts, + logFilterMethods, *conf, getFlagsMap(cmd.Flags()), ) @@ -268,7 +271,7 @@ func runStore( tracer opentracing.Tracer, httpLogOpts []logging.Option, grpcLogOpts []grpclogging.Option, - tagOpts []tags.Option, + logFilterMethods []string, conf storeConfig, flagsMap map[string]string, ) error { @@ -307,8 +310,11 @@ func runStore( if err != nil { return err } - - bkt, err := client.NewBucket(logger, confContentYaml, conf.component.String()) + customBktConfig := exthttp.DefaultCustomBucketConfig() + if err := yaml.Unmarshal(confContentYaml, &customBktConfig); err != nil { + return errors.Wrap(err, "parsing config YAML file") + } + bkt, err := client.NewBucket(logger, confContentYaml, conf.component.String(), exthttp.CreateHedgedTransportWithConfig(customBktConfig)) if err != nil { return err } @@ -394,6 +400,13 @@ func runStore( options := []store.BucketStoreOption{ store.WithLogger(logger), + store.WithRequestLoggerFunc(func(ctx context.Context, logger log.Logger) log.Logger { + reqID, ok := middleware.RequestIDFromContext(ctx) + if ok { + return log.With(logger, "request-id", reqID) + } + return logger + }), store.WithRegistry(reg), store.WithIndexCache(indexCache), store.WithQueryGate(queriesGate), @@ -508,13 +521,13 @@ func runStore( // Start query (proxy) gRPC StoreAPI. { - tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), conf.grpcConfig.tlsSrvCert, conf.grpcConfig.tlsSrvKey, conf.grpcConfig.tlsSrvClientCA) + tlsCfg, err := tls.NewServerConfig(log.With(logger, "protocol", "gRPC"), conf.grpcConfig.tlsSrvCert, conf.grpcConfig.tlsSrvKey, conf.grpcConfig.tlsSrvClientCA, conf.grpcConfig.tlsMinVersion) if err != nil { return errors.Wrap(err, "setup gRPC server") } storeServer := store.NewInstrumentedStoreServer(reg, bs) - s := grpcserver.New(logger, reg, tracer, grpcLogOpts, tagOpts, conf.component, grpcProbe, + s := grpcserver.New(logger, reg, tracer, grpcLogOpts, logFilterMethods, conf.component, grpcProbe, grpcserver.WithServer(store.RegisterStoreServer(storeServer, logger)), grpcserver.WithServer(info.RegisterInfoServer(infoSrv)), grpcserver.WithListen(conf.grpcConfig.bindAddress), diff --git a/cmd/thanos/testdata/rules-files/unreadable_valid.yaml b/cmd/thanos/testdata/rules-files/unreadable_valid.yaml new file mode 100755 index 0000000000..fb75e799e2 --- /dev/null +++ b/cmd/thanos/testdata/rules-files/unreadable_valid.yaml @@ -0,0 +1,18 @@ +groups: + - name: test-alert-group + partial_response_strategy: "warn" + interval: 2m + rules: + - alert: TestAlert + expr: 1 + labels: + key: value + annotations: + key: value + + - name: test-rule-group + partial_response_strategy: "warn" + interval: 2m + rules: + - record: test_metric + expr: 1 diff --git a/cmd/thanos/tools.go b/cmd/thanos/tools.go index 4121ae8f52..f64d4b0086 100644 --- a/cmd/thanos/tools.go +++ b/cmd/thanos/tools.go @@ -55,7 +55,6 @@ func checkRulesFiles(logger log.Logger, patterns *[]string) error { if err != nil || matches == nil { err = errors.New("matching file not found") level.Error(logger).Log("result", "FAILED", "error", err) - level.Info(logger).Log() failed.Add(err) continue } @@ -64,8 +63,7 @@ func checkRulesFiles(logger log.Logger, patterns *[]string) error { f, er := os.Open(fn) if er != nil { level.Error(logger).Log("result", "FAILED", "error", er) - level.Info(logger).Log() - failed.Add(err) + failed.Add(er) continue } defer func() { _ = f.Close() }() @@ -77,7 +75,6 @@ func checkRulesFiles(logger log.Logger, patterns *[]string) error { level.Error(logger).Log("error", e.Error()) failed.Add(e) } - level.Info(logger).Log() continue } level.Info(logger).Log("result", "SUCCESS", "rules found", n) diff --git a/cmd/thanos/tools_bucket.go b/cmd/thanos/tools_bucket.go index 326e4b09eb..e0391af15b 100644 --- a/cmd/thanos/tools_bucket.go +++ b/cmd/thanos/tools_bucket.go @@ -327,7 +327,7 @@ func registerBucketVerify(app extkingpin.AppClause, objStoreConfig *extflag.Path return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Bucket.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Bucket.String(), nil) if err != nil { return err } @@ -346,7 +346,7 @@ func registerBucketVerify(app extkingpin.AppClause, objStoreConfig *extflag.Path } } else { // nil Prometheus registerer: don't create conflicting metrics. - backupBkt, err = client.NewBucket(logger, backupconfContentYaml, component.Bucket.String()) + backupBkt, err = client.NewBucket(logger, backupconfContentYaml, component.Bucket.String(), nil) if err != nil { return err } @@ -411,7 +411,7 @@ func registerBucketLs(app extkingpin.AppClause, objStoreConfig *extflag.PathOrCo return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Bucket.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Bucket.String(), nil) if err != nil { return err } @@ -519,7 +519,7 @@ func registerBucketInspect(app extkingpin.AppClause, objStoreConfig *extflag.Pat return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Bucket.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Bucket.String(), nil) if err != nil { return err } @@ -629,7 +629,7 @@ func registerBucketWeb(app extkingpin.AppClause, objStoreConfig *extflag.PathOrC return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Bucket.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Bucket.String(), nil) if err != nil { return errors.Wrap(err, "bucket client") } @@ -826,7 +826,7 @@ func registerBucketCleanup(app extkingpin.AppClause, objStoreConfig *extflag.Pat return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Cleanup.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Cleanup.String(), nil) if err != nil { return err } @@ -870,6 +870,7 @@ func registerBucketCleanup(app extkingpin.AppClause, objStoreConfig *extflag.Pat ignoreDeletionMarkFilter, stubCounter, stubCounter, + 0, ) if err != nil { return errors.Wrap(err, "create syncer") @@ -1013,12 +1014,12 @@ func getKeysAlphabetically(labels map[string]string) []string { // matchesSelector checks if blockMeta contains every label from // the selector with the correct value. func matchesSelector(blockMeta *metadata.Meta, selectorLabels labels.Labels) bool { - for _, l := range selectorLabels { - if v, ok := blockMeta.Thanos.Labels[l.Name]; !ok || v != l.Value { - return false - } - } - return true + matches := true + selectorLabels.Range(func(l labels.Label) { + val, ok := blockMeta.Thanos.Labels[l.Name] + matches = matches && ok && val == l.Value + }) + return matches } // getIndex calculates the index of s in strs. @@ -1083,7 +1084,7 @@ func registerBucketMarkBlock(app extkingpin.AppClause, objStoreConfig *extflag.P return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Mark.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Mark.String(), nil) if err != nil { return err } @@ -1163,7 +1164,7 @@ func registerBucketRewrite(app extkingpin.AppClause, objStoreConfig *extflag.Pat return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Rewrite.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Rewrite.String(), nil) if err != nil { return err } @@ -1371,7 +1372,7 @@ func registerBucketRetention(app extkingpin.AppClause, objStoreConfig *extflag.P return err } - bkt, err := client.NewBucket(logger, confContentYaml, component.Retention.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Retention.String(), nil) if err != nil { return err } @@ -1413,6 +1414,7 @@ func registerBucketRetention(app extkingpin.AppClause, objStoreConfig *extflag.P ignoreDeletionMarkFilter, stubCounter, stubCounter, + 0, ) if err != nil { return errors.Wrap(err, "create syncer") @@ -1460,7 +1462,7 @@ func registerBucketUploadBlocks(app extkingpin.AppClause, objStoreConfig *extfla return errors.Wrap(err, "unable to parse objstore config") } - bkt, err := client.NewBucket(logger, confContentYaml, component.Upload.String()) + bkt, err := client.NewBucket(logger, confContentYaml, component.Upload.String(), nil) if err != nil { return errors.Wrap(err, "unable to create bucket") } diff --git a/cmd/thanos/tools_test.go b/cmd/thanos/tools_test.go index 81b616111f..7d39abda55 100644 --- a/cmd/thanos/tools_test.go +++ b/cmd/thanos/tools_test.go @@ -4,6 +4,7 @@ package main import ( + "os" "testing" "github.com/go-kit/log" @@ -44,4 +45,11 @@ func Test_CheckRules_Glob(t *testing.T) { // invalid path files = &[]string{"./testdata/rules-files/*.yamlaaa"} testutil.NotOk(t, checkRulesFiles(logger, files), "expected err for file %s", files) + + // Unreadble path + files = &[]string{"./testdata/rules-files/unreadable_valid.yaml"} + filename := (*files)[0] + testutil.Ok(t, os.Chmod(filename, 0000), "failed to change file permissions of %s to 0000", filename) + testutil.NotOk(t, checkRulesFiles(logger, files), "expected err for file %s", files) + testutil.Ok(t, os.Chmod(filename, 0777), "failed to change file permissions of %s to 0777", filename) } diff --git a/docs/blog/2023-11-20-life-of-a-sample-part-1.md b/docs/blog/2023-11-20-life-of-a-sample-part-1.md new file mode 100644 index 0000000000..99c73b4dfe --- /dev/null +++ b/docs/blog/2023-11-20-life-of-a-sample-part-1.md @@ -0,0 +1,210 @@ +--- +title: Life of a Sample in Thanos, and How to Configure it – Ingestion – Part I +date: "2024-09-16" +author: Thibault Mangé (https://github.com/thibaultmg) +--- + +## Life of a Sample in Thanos, and How to Configure it – Ingestion – Part I + +### Introduction + +Thanos is a sophisticated distributed system with a broad range of capabilities, and with that comes a certain level of configuration complexity. In this series of articles, we will take a deep dive into the lifecycle of a sample within Thanos, tracking its journey from initial ingestion to final retrieval. Our focus will be to explain Thanos's critical internal mechanisms and highlight the essential configurations for each component, guiding you toward achieving your desired operational results. We will be covering the following Thanos components: + +* **Receive**: Ingests samples from remote Prometheus instances and uploads blocks to object storage. +* **Sidecar**: Attaches to Prometheus pods as a sidecar container, ingests its data and uploads blocks to object storage. +* **Compactor**: Merges and deduplicates blocks in object storage. +* **Store**: Exposes blocks in object storage for querying. +* **Query**: Retrieves data from stores and processes queries. +* **Query Frontend**: Distributes incoming queries to Querier instances. + +The objective of this series of articles is to make Thanos more accessible to new users, helping alleviate any initial apprehensions. We will also assume that the working environment is Kubernetes. Given the extensive ground to cover, our goal is to remain concise throughout this exploration. + +Before diving deeper, please check the [annexes](#annexes) to clarify some essential terminology. If you are already familiar with these concepts, feel free to skip ahead. + +### The Sample Origin: Do You Have Close Integration Capabilities? + +The sample usually originates from a Prometheus instance that is scraping targets in a cluster. There are two possible scenarios: + +* The **Prometheus instances are under your control and you can access it from your Thanos deployment**. In this case, you can use the Thanos sidecar, which you will attach to the pod running the Prometheus server. The Thanos sidecar will directly read the raw samples from the Prometheus server using the [remote read API](https://prometheus.io/docs/prometheus/latest/querying/remote_read_api/). Then, the sidecar will behave similarly to the other scenario. It will expose its local data via the Store API as a **Receiver**, without the routing and ingestion parts. Thus, we will not delve further into this use case. +* The **Prometheus servers are running in clusters that you do not control**. In this case, you cannot attach a sidecar to the Prometheus server and you cannot fetch its data. The samples will travel to your Thanos system using the remote write protocol. This is the scenario we will focus on. + +Also, bear in mind that if adding Thanos for collecting your cluster’s metrics removes the need for a full fledged local Prometheus (with querying and alerting), you can save some resources by using the [Prometheus Agent mode](https://prometheus.io/docs/prometheus/latest/feature_flags/#prometheus-agent). In this configuration, it will only scrape the targets and forward the data to the Thanos system. + +The following diagram illustrates the two scenarios: + +Close integration vs external client + +Comparing the two deployment modes, the Sidecar Mode is generally preferable due to its simpler configuration and fewer moving parts. However, if this isn't possible, opt for the **Receive Mode**. Bear in mind, this mode requires careful configuration to ensure high availability, scalability, and durability. It adds another layer of indirection and comes with the overhead of operating the additional component. + +### Sending Samples to Thanos + +#### The Remote Write Protocol + +Let's start with our first Thanos component, the **Receive** or **Receiver**, the entry point to the system. It was introduced with this [proposal](https://thanos.io/tip/proposals-done/201812-thanos-remote-receive.md/). This component facilitates the ingestion of metrics from multiple clients, eliminating the need for close integration with the clients' Prometheus deployments. + +Thanos Receive exposes a remote-write endpoint (see [Prometheus remote-write](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write)) that Prometheus servers can use to transmit metrics. The only prerequisite on the client side is to configure the remote write endpoint on each Prometheus server, a feature natively supported by Prometheus. + +On the Receive component, the remote write endpoint is configured with the `--remote-write.address` flag. You can also configure TLS options using other `--remote-write.*` flags. You can see the full list of the Receiver flags [here](https://thanos.io/tip/components/receive.md/#flags). + +The remote-write protocol is based on HTTP POST requests. The payload consists of a protobuf message containing a list of time-series samples and labels. Generally, a payload contains at most one sample per time series and spans numerous time series. Metrics are typically scraped every 15 seconds, with a maximum remote write delay of 5 seconds to minimize latency, from scraping to query availability on the receiver. + +#### Tuning the Remote Write Protocol + +The Prometheus remote write configuration offers various parameters to tailor the connection specifications, parallelism, and payload properties (compression, batch size, etc.). While these may seem like implementation details for Prometheus, understanding them is essential for optimizing ingestion, as they form a sensitive part of the system. + +From an implementation standpoint, the key idea is to read directly from the TSDB WAL (Write Ahead Log), a simple mechanism commonly used by databases to ensure data durability. If you wish to delve deeper into the TSDB WAL, check out this [great article](https://ganeshvernekar.com/blog/prometheus-tsdb-wal-and-checkpoint). Once samples are extracted from the WAL, they are aggregated into parallel queues (shards) as remote-write payloads. When a queue reaches its limit or a maximum timeout is reached, the remote-write client stops reading the WAL and dispatches the data. The cycle continues. The parallelism is defined by the number of shards, their number is dynamically optimized. More insights on Prometheus's remote write can be found in the [documentation](https://prometheus.io/docs/practices/remote_write/). You can also find troubleshooting tips on [Grafana's blog](https://grafana.com/blog/2021/04/12/how-to-troubleshoot-remote-write-issues-in-prometheus/#troubleshooting-and-metrics). + +The following diagram illustrates the impacts of each parameter on the remote write protocol: + +Remote write + +Key Points to Consider: + +* **The send deadline setting**: `batch_send_deadline` should be set to around 5s to minimize latency. This timeframe strikes a balance between minimizing latency and avoiding excessive request frequency that could burden the Receiver. While a 5-second delay might seem substantial in critical alert scenarios, it is generally acceptable considering the typical resolution time for most issues. +* **The backoff settings**: The `min_backoff` should ideally be no less than 250 milliseconds, and the `max_backoff` should be at least 10 seconds. These settings help prevent Receiver overload, particularly in situations like system restarts, by controlling the rate of data sending. + +#### Protecting the Receiver from Overuse + +In scenarios where you have limited control over client configurations, it becomes essential to shield the Receive component from potential misuse or overload. The Receive component includes several configuration options designed for this purpose, comprehensively detailed in the [official documentation](https://thanos.io/tip/components/receive.md/#limits--gates-experimental). Below is a diagram illustrating the impact of these configuration settings: + +Receive limits + +When implementing a topology with separate router and ingestor roles (as we will see later), these limits should be enforced at the router level. + +Key points to consider: + +* **Series and samples limits**: Typically, with a standard target scrape interval of 15 seconds and a maximum remote write delay of 5 seconds, the `series_limit` and `samples_limit` tend to be functionally equivalent. However, in scenarios where the remote writer is recovering from downtime, the `samples_limit` may become more restrictive, as the payload might include multiple samples for the same series. +* **Handling request limits**: If a request exceeds these limits, the system responds with a 413 (Entity Too Large) HTTP error. Currently, Prometheus does not support splitting requests in response to this error, leading to data loss. +* **Active series limiting**: The limitation on active series persists as long as the count remains above the set threshold in the Receivers' TSDBs. Active series represent the number of time series currently stored in the TSDB's (Time Series Database) head block. The head block is the in-memory portion of the TSDB where incoming samples are temporarily stored before being compacted into persistent on-disk blocks. The head block is typically compacted every two hours. This is when stale series are removed, and the active series count decreases. Requests reaching this limit are rejected with a 429 (Too Many Requests) HTTP code, triggering retries. + +Considering these aspects, it is important to carefully monitor and adjust these limits. While they serve as necessary safeguards, overly restrictive settings can inadvertently lead to data loss. + +### Receiving Samples with High Availability and Durability + +#### The Need for Multiple Receive Instances + +Relying on a single instance of Thanos Receive is not sufficient for two main reasons: + +* Scalability: As your metrics grow, so does the need to scale your infrastructure. +* Reliability: If a single Receive instance falls, it disrupts metric collection, affecting rule evaluation and alerting. Furthermore, during downtime, Prometheus servers will buffer data in their Write-Ahead Log (WAL). If the outage exceeds the WAL's retention duration (default is 2 hours), this can lead to data loss. + +#### The Hashring Mechanism + +To achieve high availability, it is necessary to deploy multiple Receive replicas. However, it is not just about having more instances; it is crucial to maintain consistency in sample ingestion. In other words, samples from a given time series should always be ingested by the same Receive instance. This is necessary for optimized operations. When this is not achieved, it imposes a higher load on other operations such as compacting the data or querying the data. + +To that effect, you guessed it, the Receive component uses a hashring! With the hashring, every Receive participant knows and agrees on who must ingest which sample. When clients send data, they connect to any Receive instance, which then routes the data to the correct instances based on the hashring. This is why the Receive component is also known as the **IngestorRouter**. + +IngestorRouter + +Receive instances use a gossip protocol to maintain a consistent view of the hashring, requiring inter-instance communication via a configured HTTP server (`--http-address` flag). + +There are two possible hashrings: + +* **hashmod**: This algorithm distributes time series by hashing labels modulo the number of instances. It is effective in evenly distributing the load. The downside is that scaling operations on the hashring cause a high churn of time series on the nodes, requiring each node to flush its TSDB head and upload its recent blocks on the object storage. During this operation that can last a few minutes, the receivers cannot ingest data, causing a downtime. This is especially critical if you are running big Receive nodes. The more data they have, the longer the downtime. +* **ketama**: A more recent addition, an implementation of a consistent hashing algorithm. It means that during scaling operations, most of the time series will remain attached to the same nodes. No TSDB operation or data upload is needed before operating into the new configuration. As a result, the downtime is minimal, just the time for the nodes to agree on the new hashring. As a downside, it can be less efficient in evenly distributing the load compared to hashmod. + +The hashring algorithm is configured with the `--receive.hashrings-algorithm` flag. You can use the [Thanos Receive Controller](https://github.com/observatorium/thanos-receive-controller) to automate the management of the hashring. + +Key points to consider: + +* The case for hashmod: If your load is stable for the foreseeable future, the `hashmod` algorithm is a good choice. It is more efficient in evenly distributing the load. Otherwise, `ketama` is recommended for its operational benefits. +* The case for small Receive nodes: If you have smaller Receive nodes, the downtime during scaling operation with the `hashmod` algorithm will be shorter as the amount of data to upload to the object storage is smaller. Also, when using the `ketama` algorithm, if a node falls, its requests are directly redistributed to the remaining nodes. This could cause them to be overwhelmed if there are too few of them and result in a downtime. With more nodes, the added load represents a smaller fraction of the total load. +* Protecting the nodes after recovery: During a downtime, the Receive replies with 503 to the clients, which is interpreted as a temporary failure and remote-writes are retried. At that moment, your Receive will have to catch up and ingest a lot of data. This is why we recommend using the `--receive.limits-config` flag to limit the amount of data that can be received. This will prevent the Receive from being overwhelmed by the catch up. + +#### Ensuring Samples Durability + +For clients requiring high data durability, the `--receive.replication-factor` flag ensures data duplication across multiple receivers. When set to n, it will only reply with a successful processing response to the client once it has duplicated the data to `n-1` other receivers. Additionally, an external replicas label can be added to each Receive instance (`--label` flag) to mark replicated data. This setup increases data resilience but also expands the data footprint. + +For even greater durability, replication can take into account the [availability zones](https://thanos.io/tip/components/receive.md/#az-aware-ketama-hashring-experimental) of the Receive instances. It will ensure that data is replicated to instances in different availability zones, reducing the risk of data loss in case of a zone failure. This is however only supported with the `ketama` algorithm. + +Beyond the increased storage cost of replication, another downside is the increased load on the Receive instances that must now forward a given request to multiple nodes, according to the time series labels. Nodes receiving the first replica then must forward the series to the next Receive node until the replication factor is satisfied. This multiplies the internodes communication, especially with big hashrings. + +#### Improving Scalability and Reliability + +A new deployment topology was [proposed](https://thanos.io/tip/proposals-accepted/202012-receive-split.md/), separating the **router** and **ingestor** roles. The hashring configuration is read by the routers, which will direct each time series to the appropriate ingestor and its replicas. This role separation provides some important benefits: + +* **Scalability**: The routers and ingestors have different constraints and can be scaled independently. The router requires a performant network and CPU to route the samples, while the ingestor needs significant memory and storage. The router is stateless, while the ingestor is stateful. This separation of concerns also enables the setup of more complex topologies, such as chaining routers and having multiple hashrings. For example, you can have different hashrings attached to the routers, grouping distinct tenants with different service levels supported by isolated groups of ingestors. +* **Reliability**: During hashring reconfigurations, especially with the hashmod algorithm, some nodes may become ready before others, leading to a partially operational hashring that results in many request failures because replicas cannot be forwarded. This triggers retries, increasing the load and causing instabilities. Relieving the ingestors from the routing responsibilities makes them more stable and less prone to overload. This is especially important as they are stateful components. Routers, on the other hand, are stateless and can be easily scaled up and down. + +IngestorRouter + +The Receive instance behaves in the following way: + +* When both a hashring and `receive.local-endpoint` are set, it acts as a **RouterIngestor**. This last flag enables the router to identify itself in the hashring as an ingestor and ingest the data when appropriate. +* When no hashring is set, it simply ingests the data and acts as an **Ingestor**. +* When only the hashring is set, it acts as a **Router** and forwards the data to the correct ingestor. + +#### Handling Out-of-Order Timestamps + +To enhance reliability in data ingestion, Thanos Receive supports out-of-order samples. + +Samples are ingested into the Receiver's TSDB, which has strict requirements for the order of timestamps: + +* Samples are expected to have increasing timestamps for a given time series. +* A new sample cannot be more than 1 hour older than the most recent sample of any time series in the TSDB. + +When these requirements are not met, the samples are dropped, and an out-of-order warning is logged. However, there are scenarios where out-of-order samples may occur, often because of [clients' misconfigurations](https://thanos.io/tip/operating/troubleshooting.md/#possible-cause-1) or delayed remote write requests, which can cause samples to arrive out of order depending on the remote write implementation. Additional examples at the Prometheus level can be found in [this article](https://promlabs.com/blog/2022/12/15/understanding-duplicate-samples-and-out-of-order-timestamp-errors-in-prometheus/). + +As you are not necessarily in control of your clients' setups, you may want to increase resilience against these issues. Support for out-of-order samples has been implemented for the TSDB. This feature can be enabled with the `tsdb.out-of-order.time-window` flag on the Receiver. The downsides are: + +* An increase in the TSDB's memory usage, proportional to the number of out-of-order samples. +* The TSDB will produce blocks with overlapping time periods, which the compactor must handle. Ensure the `--compact.enable-vertical-compaction` [flag](https://thanos.io/tip/components/compact.md/#enabling-vertical-compaction) is enabled on the compactor to manage these overlapping blocks. We will cover this in more detail in the next article. + +Additionally, consider setting the `tsdb.too-far-in-future.time-window` flag to a value higher than the default 0s to account for possible clock drifts between clients and the Receiver. + +### Conclusion + +In this first part, we have covered the initial steps of the sample lifecycle in Thanos, focusing on the ingestion process. We have explored the remote write protocol, the Receive component, and the critical configurations needed to ensure high availability and durability. Now, our sample is safely ingested and stored in the system. In the next part, we will continue following our sample's journey, delving into the data management and querying processes. + +See the full list of articles in this series: + +* Life of a sample in thanos, and how to configure it – Ingestion – Part I +* Life of a sample in thanos, and how to configure it – Data Management – Part II +* Life of a sample in thanos, and how to configure it – Querying – Part III + +### Annexes + +#### Metrics Terminology: Samples, Labels and Series + +* **Sample**: A sample in Prometheus represents a single data point, capturing a measurement of a specific system aspect or property at a given moment. It is the fundamental unit of data in Prometheus, reflecting real-time system states. +* **Labels**: very sample in Prometheus is tagged with labels, which are key-value pairs that add context and metadata. These labels typically include: + + * The nature of the metric being measured. + * The source or origin of the metric. + * Other relevant contextual details. + +* **External labels**: External labels are appended by the scraping or receiving component (like a Prometheus server or Thanos Receive). They enable: + + * **Sharding**: Included in the `meta.json` file of the block created by Thanos, these labels are used by the compactor and the store to shard blocks processing effectively. + * **Deduplication**: In high-availability setups where Prometheus servers scrape the same targets, external labels help identify and deduplicate similar samples. + * **Tenancy isolation**: In multi-tenant systems, external labels are used to segregate data per tenant, ensuring logical data isolation. + +* **Series** or **Time Series**: In the context of monitoring, a Series, which is a more generic term is necessarily a time series. A series is defined by a unique set of label-value combinations. For instance: + +``` +http_requests_total{method="GET", handler="/users", status="200"} +^ ^ +Series name (label `__name__`) Labels (key=value format) +``` + +In this example, http_requests_total is a specific label (`__name__`). The unique combination of labels creates a distinct series. Prometheus scrapes these series, attaching timestamps to each sample, thereby forming a dynamic time series. + +For our discussion, samples can be of various types, but we will treat them as simple integers for simplicity. + +The following diagram illustrates the relationship between samples, labels and series: + +Series terminology + +#### TSDB Terminology: Chunks, Chunk Files and Blocks + +Thanos adopts its [storage architecture](https://thanos.io/tip/thanos/storage.md/#data-in-object-storage) from [Prometheus](https://prometheus.io/docs/prometheus/latest/storage/), utilizing the TSDB (Time Series Database) [file format](https://github.com/prometheus/prometheus/blob/release-2.48/tsdb/docs/format/README.md) as its foundation. Let's review some key terminology that is needed to understand some of the configuration options. + +**Samples** from a given time series are first aggregated into small **chunks**. The storage format of a chunk is highly compressed ([see documentation](https://github.com/prometheus/prometheus/blob/release-2.48/tsdb/docs/format/chunks.md#xor-chunk-data)). Accessing a given sample of the chunk requires decoding all preceding values stored in this chunk. This is why chunks hold up to 120 samples, a number chosen to strike a balance between compression benefits and the performance of reading data. + +Chunks are created over time for each time series. As time progresses, these chunks are assembled into **chunk files**. Each chunk file, encapsulating chunks from various time series, is limited to 512MiB to manage memory usage effectively during read operations. Initially, these files cover a span of two hours and are subsequently organized into a larger entity known as a **block**. + +A **block** is a directory containing the chunk files in a specific time range, an index and some metadata. The two-hour duration for initial blocks is chosen for optimizing factors like storage efficiency and read performance. Over time, these two-hour blocks undergo horizontal compaction by the compactor, merging them into larger blocks. This process is designed to optimize long-term storage by extending the time period each block covers. + +The following diagram illustrates the relationship between chunks, chunk files and blocks: + +TSDB terminology diff --git a/docs/blog/img/life-of-a-sample/close-integration.png b/docs/blog/img/life-of-a-sample/close-integration.png new file mode 100644 index 0000000000..9fb066355f Binary files /dev/null and b/docs/blog/img/life-of-a-sample/close-integration.png differ diff --git a/docs/blog/img/life-of-a-sample/ingestor-router.png b/docs/blog/img/life-of-a-sample/ingestor-router.png new file mode 100644 index 0000000000..c60b7caf3a Binary files /dev/null and b/docs/blog/img/life-of-a-sample/ingestor-router.png differ diff --git a/docs/blog/img/life-of-a-sample/receive-limits.png b/docs/blog/img/life-of-a-sample/receive-limits.png new file mode 100644 index 0000000000..eb64e002d1 Binary files /dev/null and b/docs/blog/img/life-of-a-sample/receive-limits.png differ diff --git a/docs/blog/img/life-of-a-sample/remote-write.png b/docs/blog/img/life-of-a-sample/remote-write.png new file mode 100644 index 0000000000..518ab6b55a Binary files /dev/null and b/docs/blog/img/life-of-a-sample/remote-write.png differ diff --git a/docs/blog/img/life-of-a-sample/router-and-ingestor.png b/docs/blog/img/life-of-a-sample/router-and-ingestor.png new file mode 100644 index 0000000000..e7770a4fcd Binary files /dev/null and b/docs/blog/img/life-of-a-sample/router-and-ingestor.png differ diff --git a/docs/blog/img/life-of-a-sample/series-terminology.png b/docs/blog/img/life-of-a-sample/series-terminology.png new file mode 100644 index 0000000000..a3b3979888 Binary files /dev/null and b/docs/blog/img/life-of-a-sample/series-terminology.png differ diff --git a/docs/blog/img/life-of-a-sample/storage-terminology.png b/docs/blog/img/life-of-a-sample/storage-terminology.png new file mode 100644 index 0000000000..cfb0eee94e Binary files /dev/null and b/docs/blog/img/life-of-a-sample/storage-terminology.png differ diff --git a/docs/components/compact.md b/docs/components/compact.md index aa47143a25..a53e2c85b4 100644 --- a/docs/components/compact.md +++ b/docs/components/compact.md @@ -342,14 +342,16 @@ Flags: At least one replica label has to be set via --deduplication.replica-label flag. --deduplication.replica-label=DEDUPLICATION.REPLICA-LABEL ... - Label to treat as a replica indicator of blocks - that can be deduplicated (repeated flag). This - will merge multiple replica blocks into one. - This process is irreversible.Experimental. - When one or more labels are set, compactor - will ignore the given labels so that vertical - compaction can merge the blocks.Please note - that by default this uses a NAIVE algorithm + Experimental. Label to treat as a replica + indicator of blocks that can be deduplicated + (repeated flag). This will merge multiple + replica blocks into one. This process is + irreversible. Flag may be specified multiple + times as well as a comma separated list of + labels. When one or more labels are set, + compactor will ignore the given labels so that + vertical compaction can merge the blocks.Please + note that by default this uses a NAIVE algorithm for merging which works well for deduplication of blocks with **precisely the same samples** like produced by Receiver replication.If you diff --git a/docs/components/query-frontend.md b/docs/components/query-frontend.md index 8025cdecc8..8a383510c2 100644 --- a/docs/components/query-frontend.md +++ b/docs/components/query-frontend.md @@ -157,6 +157,8 @@ Other cache configuration parameters, you can refer to [redis-index-cache](store Query Frontend supports `--query-frontend.log-queries-longer-than` flag to log queries running longer than some duration. +The field `remote_user` can be read from an HTTP header, like `X-Grafana-User`, by setting `--query-frontend.slow-query-logs-user-header`. + ## Naming Naming is hard :) Please check [here](https://github.com/thanos-io/thanos/pull/2434#discussion_r408300683) to see why we chose `query-frontend` as the name. @@ -276,6 +278,10 @@ Flags: functions in query-frontend. --no-query-frontend.enable-x-functions for disabling. + --query-frontend.force-query-stats + Enables query statistics for all queries and + will export statistics as logs and service + headers. --query-frontend.forward-header= ... List of headers forwarded by the query-frontend to downstream queriers, default is empty @@ -295,6 +301,11 @@ Flags: the request, the first matching arg specified will take precedence. If no headers match 'anonymous' will be used. + --query-frontend.slow-query-logs-user-header= + Set the value of the field remote_user in the + slow query logs to the value of the given HTTP + header. Falls back to reading the user from the + basic auth header. --query-frontend.vertical-shards=QUERY-FRONTEND.VERTICAL-SHARDS Number of shards to use when distributing shardable PromQL queries. diff --git a/docs/components/query.md b/docs/components/query.md index 7a130b0f51..10975138b6 100644 --- a/docs/components/query.md +++ b/docs/components/query.md @@ -103,7 +103,7 @@ thanos query \ This logic can also be controlled via parameter on QueryAPI. More details below. -## Experimental PromQL Engine +## Thanos PromQL Engine (experimental) By default, Thanos querier comes with standard Prometheus PromQL engine. However, when `--query.promql-engine=thanos` is specified, Thanos will use [experimental Thanos PromQL engine](http://github.com/thanos-community/promql-engine) which is a drop-in, efficient implementation of PromQL engine with query planner and optimizers. @@ -113,6 +113,14 @@ This feature is still **experimental** given active development. All queries sho For new engine bugs/issues, please use https://github.com/thanos-community/promql-engine GitHub issues. +### Distributed execution mode + +When using Thanos PromQL Engine the distributed execution mode can be enabled using `--query.mode=distributed`. When this mode is enabled, the Querier will break down each query into independent fragments and delegate them to components which implement the Query API. + +This mode is particularly useful in architectures where multiple independent Queriers are deployed in separate environments (different regions or different Kubernetes clusters) and are federated through a separate central Querier. A Querier running in the distributed mode will only talk to Queriers, or other components which implement the Query API. Endpoints which only act as Stores (e.g. Store Gateways or Rulers), and are directly connected to a distributed Querier, will not be included in the execution of a distributed query. This constraint should help with keeping the distributed query execution simple and efficient, but could be removed in the future if there are good use cases for it. + +For further details on the design and use cases of this feature, see the [official design document](https://thanos.io/tip/proposals-done/202301-distributed-query-execution.md/). + ## Query API Overview As mentioned, Query API exposed by Thanos is guaranteed to be compatible with [Prometheus 2.x. API](https://prometheus.io/docs/prometheus/latest/querying/api/). However for additional Thanos features on top of Prometheus, Thanos adds: @@ -274,14 +282,6 @@ In case of nested Thanos Query components, it's important to note that tenancy e Further, note that there are no authentication mechanisms in Thanos, so anyone can set an arbitrary tenant in the HTTP header. It is recommended to use a proxy in front of the querier in case an authentication mechanism is needed. The Query UI also includes an option to set an arbitrary tenant, and should therefore not be exposed to end-users if users should not be able to see each others data. -### Distributed execution mode - -The distributed execution mode can be enabled using `--query.mode=distributed`. When this mode is enabled, the Querier will break down each query into independent fragments and delegate them to components which implement the Query API. - -This mode is particularly useful in architectures where multiple independent Queriers are deployed in separate environments (different regions or different Kubernetes clusters) and are federated through a separate central Querier. A Querier running in the distributed mode will only talk to Queriers, or other components which implement the Query API. Endpoints which only act as Stores (e.g. Store Gateways or Rulers), and are directly connected to a distributed Querier, will not be included in the execution of a distributed query. This constraint should help with keeping the distributed query execution simple and efficient, but could be removed in the future if there are good use cases for it. - -For further details on the design and use cases of this feature, see the [official design document](https://thanos.io/tip/proposals-done/202301-distributed-query-execution.md/). - ## Flags ```$ mdox-exec="thanos query --help" @@ -353,6 +353,11 @@ Flags: verification on server side. (tls.NoClientCert) --grpc-server-tls-key="" TLS Key for the gRPC server, leave blank to disable TLS + --grpc-server-tls-min-version="1.3" + TLS supported minimum version for gRPC server. + If no version is specified, it'll default to + 1.3. Allowed values: ["1.0", "1.1", "1.2", + "1.3"] -h, --help Show context-sensitive help (also try --help-long and --help-man). --http-address="0.0.0.0:10902" @@ -423,6 +428,19 @@ Flags: --query.partial-response Enable partial response for queries if no partial_response param is specified. --no-query.partial-response for disabling. + --query.partition-label=QUERY.PARTITION-LABEL ... + Labels that partition the leaf queriers. This + is used to scope down the labelsets of leaf + queriers when using the distributed query mode. + If set, these labels must form a partition + of the leaf queriers. Partition labels must + not intersect with replica labels. Every TSDB + of a leaf querier must have these labels. + This is useful when there are multiple external + labels that are irrelevant for the partition as + it allows the distributed engine to ignore them + for some optimizations. If this is empty then + all labels are used as partition labels. --query.promql-engine=prometheus Default PromQL engine to use. --query.replica-label=QUERY.REPLICA-LABEL ... @@ -431,6 +449,8 @@ Flags: be able to query without deduplication using 'dedup=false' parameter. Data includes time series, recording rules, and alerting rules. + Flag may be specified multiple times as well as + a comma separated list of labels. --query.telemetry.request-duration-seconds-quantiles=0.1... ... The quantiles for exporting metrics about the request duration quantiles. diff --git a/docs/components/receive.md b/docs/components/receive.md index 677c5e142b..cd0dc322c7 100644 --- a/docs/components/receive.md +++ b/docs/components/receive.md @@ -26,6 +26,24 @@ If you are using the `hashmod` algorithm and wish to migrate to `ketama`, the si This algorithm uses a `hashmod` function over all labels to decide which receiver is responsible for a given timeseries. This is the default algorithm due to historical reasons. However, its usage for new Receive installations is discouraged since adding new Receiver nodes leads to series churn and memory usage spikes. +### Replication protocols + +By default, Receivers replicate data using Protobuf over gRPC. Deserializing protobuf-encoded messages can be resource-intensive and cause significant GC pressure. Alternatively, you can use [Cap'N Proto](https://capnproto.org/) for replication encoding and as the RPC framework. + +In order to enable this mode, you can use the `receive.replication-protocol=capnproto` option on the receiver. Thanos will try to infer the Cap'N Proto address of each peer in the hashring using the existing gRPC address. You can also explicitly set the Cap'N Proto as follows: + +```json +[ + { + "endpoints": [ + {"address": "node-1:10901", "capnproto_address": "node-1:19391"}, + {"address": "node-2:10901", "capnproto_address": "node-2:19391"}, + {"address": "node-3:10901", "capnproto_address": "node-3:19391"} + ] + } +] +``` + ### Hashring management and autoscaling in Kubernetes The [Thanos Receive Controller](https://github.com/observatorium/thanos-receive-controller) project aims to automate hashring management when running Thanos in Kubernetes. In combination with the Ketama hashring algorithm, this controller can also be used to keep hashrings up to date when Receivers are scaled automatically using an HPA or [Keda](https://keda.sh/). @@ -94,6 +112,8 @@ config: server_name: "" insecure_skip_verify: false disable_compression: false + chunk_size_bytes: 0 + max_retries: 0 prefix: "" ``` @@ -307,6 +327,26 @@ This number of workers is controlled by `--receive.forward.async-workers=`. Please see the metric `thanos_receive_forward_delay_seconds` to see if you need to increase the number of forwarding workers. +## Quorum + +The following formula is used for calculating quorum: + +```go mdox-exec="sed -n '1012,1022p' pkg/receive/handler.go" +// writeQuorum returns minimum number of replicas that has to confirm write success before claiming replication success. +func (h *Handler) writeQuorum() int { + // NOTE(GiedriusS): this is here because otherwise RF=2 doesn't make sense as all writes + // would need to succeed all the time. Another way to think about it is when migrating + // from a Sidecar based setup with 2 Prometheus nodes to a Receiver setup, we want to + // keep the same guarantees. + if h.options.ReplicationFactor == 2 { + return 1 + } + return int((h.options.ReplicationFactor / 2) + 1) +} +``` + +So, if the replication factor is 2 then at least one write must succeed. With RF=3, two writes must succeed, and so on. + ## Flags ```$ mdox-exec="thanos receive --help" @@ -320,6 +360,9 @@ Flags: detected maximum container or system memory. --enable-auto-gomemlimit Enable go runtime to automatically limit memory consumption. + --enable-feature= ... Comma separated experimental feature names + to enable. The current list of features is + metric-names-filter. --grpc-address="0.0.0.0:10901" Listen ip:port address for gRPC endpoints (StoreAPI). Make sure this address is routable @@ -338,6 +381,11 @@ Flags: verification on server side. (tls.NoClientCert) --grpc-server-tls-key="" TLS Key for the gRPC server, leave blank to disable TLS + --grpc-server-tls-min-version="1.3" + TLS supported minimum version for gRPC server. + If no version is specified, it'll default to + 1.3. Allowed values: ["1.0", "1.1", "1.2", + "1.3"] --hash-func= Specify which hash function to use when calculating the hashes of produced files. If no function has been specified, it does not @@ -369,6 +417,8 @@ Flags: Path to YAML file that contains object store configuration. See format details: https://thanos.io/tip/thanos/storage.md/#configuration + --receive.capnproto-address="0.0.0.0:19391" + Address for the Cap'n Proto server. --receive.default-tenant-id="default-tenant" Default tenant ID to use when none is provided via a header. @@ -415,6 +465,10 @@ Flags: --receive.replication-factor=1 How many times to replicate incoming write requests. + --receive.replication-protocol=protobuf + The protocol to use for replicating + remote-write requests. One of protobuf, + capnproto --receive.split-tenant-label-name="" Label name through which the request will be split into multiple tenants. This takes @@ -460,6 +514,10 @@ Flags: --remote-write.server-tls-key="" TLS Key for the HTTP server, leave blank to disable TLS. + --remote-write.server-tls-min-version="1.3" + TLS version for the gRPC server, leave blank + to default to TLS 1.3, allow values: ["1.0", + "1.1", "1.2", "1.3"] --request.logging-config= Alternative to 'request.logging-config-file' flag (mutually exclusive). Content @@ -520,13 +578,12 @@ Flags: section in the Receive documentation: https://thanos.io/tip/components/receive.md/#tenant-lifecycle-management --tsdb.too-far-in-future.time-window=0s - [EXPERIMENTAL] Configures the allowed time - window for ingesting samples too far in the - future. Disabled (0s) by defaultPlease note - enable this flag will reject samples in the - future of receive local NTP time + configured - duration due to clock skew in remote write - clients. + Configures the allowed time window for + ingesting samples too far in the future. + Disabled (0s) by defaultPlease note enable + this flag will reject samples in the future of + receive local NTP time + configured duration + due to clock skew in remote write clients. --tsdb.wal-compression Compress the tsdb WAL. --version Show application version. diff --git a/docs/components/rule.md b/docs/components/rule.md index 5c784c9a3f..a29f2c6de2 100644 --- a/docs/components/rule.md +++ b/docs/components/rule.md @@ -352,6 +352,11 @@ Flags: verification on server side. (tls.NoClientCert) --grpc-server-tls-key="" TLS Key for the gRPC server, leave blank to disable TLS + --grpc-server-tls-min-version="1.3" + TLS supported minimum version for gRPC server. + If no version is specified, it'll default to + 1.3. Allowed values: ["1.0", "1.1", "1.2", + "1.3"] --hash-func= Specify which hash function to use when calculating the hashes of produced files. If no function has been specified, it does not @@ -458,6 +463,9 @@ Flags: Label names to be ignored when restoring alerts from the remote storage. This is only used in stateless mode. + --rule-concurrent-evaluation=1 + How many rules can be evaluated concurrently. + Default is 1. --rule-file=rules/ ... Rule files that should be used by rule manager. Can be in glob format (repeated). Note that rules are not automatically detected, diff --git a/docs/components/sidecar.md b/docs/components/sidecar.md index d41a920aa2..01295a5d4d 100644 --- a/docs/components/sidecar.md +++ b/docs/components/sidecar.md @@ -74,6 +74,8 @@ config: server_name: "" insecure_skip_verify: false disable_compression: false + chunk_size_bytes: 0 + max_retries: 0 prefix: "" ``` @@ -117,6 +119,11 @@ Flags: verification on server side. (tls.NoClientCert) --grpc-server-tls-key="" TLS Key for the gRPC server, leave blank to disable TLS + --grpc-server-tls-min-version="1.3" + TLS supported minimum version for gRPC server. + If no version is specified, it'll default to + 1.3. Allowed values: ["1.0", "1.1", "1.2", + "1.3"] --hash-func= Specify which hash function to use when calculating the hashes of produced files. If no function has been specified, it does not diff --git a/docs/components/store.md b/docs/components/store.md index 63cdbbd50d..3425000146 100644 --- a/docs/components/store.md +++ b/docs/components/store.md @@ -33,6 +33,8 @@ config: server_name: "" insecure_skip_verify: false disable_compression: false + chunk_size_bytes: 0 + max_retries: 0 prefix: "" ``` @@ -110,6 +112,11 @@ Flags: verification on server side. (tls.NoClientCert) --grpc-server-tls-key="" TLS Key for the gRPC server, leave blank to disable TLS + --grpc-server-tls-min-version="1.3" + TLS supported minimum version for gRPC server. + If no version is specified, it'll default to + 1.3. Allowed values: ["1.0", "1.1", "1.2", + "1.3"] -h, --help Show context-sensitive help (also try --help-long and --help-man). --http-address="0.0.0.0:10902" @@ -373,6 +380,12 @@ The **required** settings are: - `addresses`: list of memcached addresses, that will get resolved with the [DNS service discovery](../service-discovery.md#dns-service-discovery) provider. If your cluster supports auto-discovery, you should use the flag `auto_discovery` instead and only point to *one of* the memcached servers. This typically means that there should be only one address specified that resolves to any of the alive memcached servers. Use this for Amazon ElastiCache and other similar services. +**NOTE**: The Memcached client uses a jump hash algorithm to shard cached entries across a cluster of Memcached servers. For this reason, you should make sure memcached servers are not behind any kind of load balancer and their address is configured so that servers are added/removed to the end of the list whenever a scale up/down occurs. For example, if you’re running Memcached in Kubernetes, you may: + +1. Deploy your Memcached cluster using a [StatefulSet](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/) +2. Create a [headless](https://kubernetes.io/docs/concepts/services-networking/service/#headless-services) service for Memcached StatefulSet +3. Configure the Thanos's memcached `addresses` using the `dnssrvnoa+` [DNS service discovery](../service-discovery.md#dns-service-discovery) + While the remaining settings are **optional**: - `timeout`: the socket read/write timeout. @@ -380,7 +393,7 @@ While the remaining settings are **optional**: - `max_async_concurrency`: maximum number of concurrent asynchronous operations can occur. - `max_async_buffer_size`: maximum number of enqueued asynchronous operations allowed. - `max_get_multi_concurrency`: maximum number of concurrent connections when fetching keys. If set to `0`, the concurrency is unlimited. -- `max_get_multi_batch_size`: maximum number of keys a single underlying operation should fetch. If more keys are specified, internally keys are splitted into multiple batches and fetched concurrently, honoring `max_get_multi_concurrency`. If set to `0`, the batch size is unlimited. +- `max_get_multi_batch_size`: maximum number of keys a single underlying operation should fetch. If more keys are specified, internally keys are split into multiple batches and fetched concurrently, honoring `max_get_multi_concurrency`. If set to `0`, the batch size is unlimited. - `max_item_size`: maximum size of an item to be stored in memcached. This option should be set to the same value of memcached `-I` flag (defaults to 1MB) in order to avoid wasting network round trips to store items larger than the max item size allowed in memcached. If set to `0`, the item size is unlimited. - `dns_provider_update_interval`: the DNS discovery update interval. - `auto_discovery`: whether to use the auto-discovery mechanism for memcached. @@ -564,6 +577,33 @@ Note that there must be no trailing slash in the `peers` configuration i.e. one If timeout is set to zero then there is no timeout for fetching and fetching's lifetime is equal to the lifetime to the original request's lifetime. It is recommended to keep it higher than zero. It is generally preferred to keep this value higher because the fetching operation potentially includes loading of data from remote object storage. +## Hedged Requests + +Thanos Store Gateway supports `hedged requests` to enhance performance and reliability, particularly in high-latency environments. This feature addresses `long-tail latency issues` that can occur between the Thanos Store Gateway and an external cache, reducing the impact of slower response times on overall performance. + +The configuration options for hedged requests allow for tuning based on latency tolerance and cost considerations, as some providers may charge per request. + +In the `bucket.yml` file, you can specify the following fields under `hedging_config`: + +- `enabled`: bool to enable hedged requests. +- `up_to`: maximum number of hedged requests allowed for each initial request. + - **Purpose**: controls the redundancy level of hedged requests to improve response times. + - **Cost vs. Benefit**: increasing up_to can reduce latency but may increase costs, as some providers charge per request. Higher values provide diminishing returns on latency beyond a certain level. +- `quantile`: latency threshold, specified as a quantile (e.g., percentile), which determines when additional hedged requests should be sent. + - **Purpose**: controls when hedged requests are triggered based on response time distribution. + - **Cost vs. Benefit**: lower quantile (e.g., 0.7) initiates hedged requests sooner, potentially raising costs while lowering latency variance. A higher quantile (e.g., 0.95) will initiate hedged requests later, reducing cost by limiting redundancy. + +By default, `hedging_config` is set as follows: + +```yaml +hedging_config: + enabled: false + up_to: 3 + quantile: 0.9 +``` + +This configuration sends up to three additional requests if the initial request response time exceeds the 90th percentile. + ## Index Header In order to query series inside blocks from object storage, Store Gateway has to know certain initial info from each block index. In order to achieve so, on startup the Gateway builds an `index-header` for each block and stores it on local disk; such `index-header` is build by downloading specific pieces of original block's index, stored on local disk and then mmaped and used by Store Gateway. diff --git a/docs/components/tools.md b/docs/components/tools.md index fb91d69e88..7e34ab4c27 100644 --- a/docs/components/tools.md +++ b/docs/components/tools.md @@ -128,6 +128,8 @@ config: server_name: "" insecure_skip_verify: false disable_compression: false + chunk_size_bytes: 0 + max_retries: 0 prefix: "" ``` @@ -698,6 +700,8 @@ config: server_name: "" insecure_skip_verify: false disable_compression: false + chunk_size_bytes: 0 + max_retries: 0 prefix: "" ``` @@ -800,6 +804,8 @@ config: server_name: "" insecure_skip_verify: false disable_compression: false + chunk_size_bytes: 0 + max_retries: 0 prefix: "" ``` diff --git a/docs/contributing/mentorship.md b/docs/contributing/mentorship.md index 5fb0f501ed..4a246cba00 100644 --- a/docs/contributing/mentorship.md +++ b/docs/contributing/mentorship.md @@ -38,7 +38,7 @@ There are certain rules you can follow to make the MOST from your time with us! - Try to be independent and responsible for the feature you want to deliver. The sooner you start to lead your task, the better for you! It's hard in the beginning but try to think about the user experience. Is it hard or easy to make mistake using it? How difficult is it to migrate to this feature? Is there anything we can do to reduce data loss errors? - Try to help others by **reviewing** other contributors, mentees or mentors' Pull Requests! It sounds scary, but this is actually the best way to learn about coding practices, patterns and how to maintain high quality codebase! (GIFs on PRs are welcome as well!) - Try using an [iterative process for development](https://en.wikipedia.org/wiki/Iterative_and_incremental_development). Start with small and simple assumptions, and once you have a working example ready, keep improving and discussing with the mentors. Small changes are easy to review and easy to accept 😄. -- Try working out a [proof of concept](https://en.wikipedia.org/wiki/Proof_of_concept), which can be used as a baseline, and can be improved upon. These are real-world projects, so it's not possible to have a deterministic solution everytime, and proof of concepts are quick way to determine feasibility. +- Try working out a [proof of concept](https://en.wikipedia.org/wiki/Proof_of_concept), which can be used as a baseline, and can be improved upon. These are real-world projects, so it's not possible to have a deterministic solution every time, and proof of concepts are quick way to determine feasibility. > At the end of mentorship, it's not the end! You are welcome to join our Community Office Hours. See [this](https://docs.google.com/document/d/137XnxfOT2p1NcNUq6NWZjwmtlSdA6Wyti86Pd6cyQhs/edit#) for details. This is the meeting for any Thanos contributor, but you will find fellow current and ex-mentees on the meeting too. diff --git a/docs/getting-started.md b/docs/getting-started.md index cffc38d155..4f52745dfc 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -89,6 +89,7 @@ See up to date [jsonnet mixins](https://github.com/thanos-io/thanos/tree/main/mi ## Talks * 2024 + * [Enlightning - Scaling Your Metrics with Thanos](https://www.youtube.com/live/1qvcVJiVx7M) * [6 Learnings from Building Thanos Project](https://www.youtube.com/watch?v=ur8dDFaNEFg) * [Monitoring the World: Scaling Thanos in Dynamic Prometheus Environments](https://www.youtube.com/watch?v=ofhvbG0iTjU) * [Scaling Thanos at Reddit](https://www.youtube.com/watch?v=c18RGbAxCfI) @@ -137,6 +138,7 @@ See up to date [jsonnet mixins](https://github.com/thanos-io/thanos/tree/main/mi ## Blog posts * 2024: + * [Scaling Prometheus with Thanos.](https://www.cloudraft.io/blog/scaling-prometheus-with-thanos) * [Streamlining Long-Term Storage Query Performance for Metrics With Thanos.](https://blog.devops.dev/streamlining-long-term-storage-query-performance-for-metrics-with-thanos-b44419c70cc4) * 2023: diff --git a/docs/operating/cross-cluster-tls-communication.md b/docs/operating/cross-cluster-tls-communication.md index 77d370f7f5..af52244beb 100644 --- a/docs/operating/cross-cluster-tls-communication.md +++ b/docs/operating/cross-cluster-tls-communication.md @@ -164,7 +164,7 @@ metadata: ### Forward proxy Envoy configuration `envoy.yaml` -This is a static v2 envoy configuration (v3 example below). You will need to update this configuration for every sidecar you would like to talk to. There are also several options for dynamic configuration, like envoy XDS (and other associated dynamic config modes), or using something like terraform (if thats your deployment method) to generate the configs at deployment time. NOTE: This config **does not** send a client certificate to authenticate with remote clusters, see envoy v3 config. +This is a static v2 envoy configuration (v3 example below). You will need to update this configuration for every sidecar you would like to talk to. There are also several options for dynamic configuration, like envoy XDS (and other associated dynamic config modes), or using something like terraform (if that's your deployment method) to generate the configs at deployment time. NOTE: This config **does not** send a client certificate to authenticate with remote clusters, see envoy v3 config. ```yaml admin: diff --git a/docs/proposals-accepted/202012-deletions-object-storage.md b/docs/proposals-accepted/202012-deletions-object-storage.md index 090cdbbb67..6f1e405560 100644 --- a/docs/proposals-accepted/202012-deletions-object-storage.md +++ b/docs/proposals-accepted/202012-deletions-object-storage.md @@ -55,7 +55,7 @@ The main motivation for considering deletions in the object storage are the foll * **reason for deletion** * The entered details are processed by the CLI tool to create a tombstone file (unique for a request and irrespective of the presence of series), and the file is uploaded to the object storage making it accessible to all components. * **Filename optimization**: The filename is created from the hash of matchers, minTime and maxTime. This helps re-write an existing tombstone, whenever a same request is made in the future hence avoiding duplication of the same request. (NOTE: Requests which entail common deletions still creates different tombstones.) -* Store Gateway masks the series on processing the global tombstone files from the object storage. At chunk level, whenever there's a match with the data corresponding to atleast one of the tombstones, we skip the chunk, potentially resulting in the masking of chunk. +* Store Gateway masks the series on processing the global tombstone files from the object storage. At chunk level, whenever there's a match with the data corresponding to at least one of the tombstones, we skip the chunk, potentially resulting in the masking of chunk. ## Considerations diff --git a/docs/proposals-accepted/202108-more-granular-query-performance-metrics.md b/docs/proposals-accepted/202108-more-granular-query-performance-metrics.md index 04d1690617..345744a31e 100644 --- a/docs/proposals-accepted/202108-more-granular-query-performance-metrics.md +++ b/docs/proposals-accepted/202108-more-granular-query-performance-metrics.md @@ -203,9 +203,9 @@ func (s *seriesServer) Send(r *storepb.SeriesResponse) error { } ``` -Now that the `SeriesStats` are propagated into the `storepb.SeriesServer`, we can ammend the `selectFn` function to return a tuple of `(storage.SeriesSet, storage.SeriesSetCounter, error)` +Now that the `SeriesStats` are propagated into the `storepb.SeriesServer`, we can amend the `selectFn` function to return a tuple of `(storage.SeriesSet, storage.SeriesSetCounter, error)` -Ammending the QueryableCreator to provide a func parameter: +Amending the QueryableCreator to provide a func parameter: ```go type SeriesStatsReporter func(seriesStats storepb.SeriesStatsCounter) diff --git a/docs/proposals-accepted/202205-vertical-query-sharding.md b/docs/proposals-accepted/202205-vertical-query-sharding.md index cf38d2a26d..c467f19383 100644 --- a/docs/proposals-accepted/202205-vertical-query-sharding.md +++ b/docs/proposals-accepted/202205-vertical-query-sharding.md @@ -134,7 +134,7 @@ Using the reference implementation, we benchmarked query execution and memory us We then ran the following query on the reference dataset for 10-15 minutes: `sum by (pod) (http_requests_total)` -The memory usage of Queriers with and without sharding was ~650MB and ~1.5GB respectively, as shown n the screenshots bellow. +The memory usage of Queriers with and without sharding was ~650MB and ~1.5GB respectively, as shown n the screenshots below. Memory usage with sharding: diff --git a/docs/proposals-accepted/202206-active-series-limiting-hashring.md b/docs/proposals-accepted/202206-active-series-limiting-hashring.md index 8d88cbb339..5c397dd0d3 100644 --- a/docs/proposals-accepted/202206-active-series-limiting-hashring.md +++ b/docs/proposals-accepted/202206-active-series-limiting-hashring.md @@ -180,7 +180,7 @@ message SeriesRefMap { ### 9.2 Per-Receive Validation -We can implement the same new endpoints as mentioned in the previous approach, on Thanos Receive, but do merging and checking operations on each Receive node in the hashring, i.e change the existing Router and Ingestor modes to handle the same limting logic. +We can implement the same new endpoints as mentioned in the previous approach, on Thanos Receive, but do merging and checking operations on each Receive node in the hashring, i.e change the existing Router and Ingestor modes to handle the same limiting logic. The implementation would be as follows, diff --git a/docs/proposals-done/201812-thanos-remote-receive.md b/docs/proposals-done/201812-thanos-remote-receive.md index f72b078bad..b8297aac65 100644 --- a/docs/proposals-done/201812-thanos-remote-receive.md +++ b/docs/proposals-done/201812-thanos-remote-receive.md @@ -192,7 +192,7 @@ Receivers do not need to re-shard data on rollouts; instead, they must flush the This may produce small, and therefore unoptimized, TSDB blocks in object storage, however these are optimized away by the Thanos compactor by merging the small blocks into bigger blocks. The compaction process is done concurrently in a separate deployment to the receivers. Timestamps involved are produced by the sending Prometheus, therefore no clock synchronization is necessary. -When changing a soft tenant to a hard tenant (or vise versa), all blocks on all nodes in hashrings in which the tenant is present must be flushed. +When changing a soft tenant to a hard tenant (or vice versa), all blocks on all nodes in hashrings in which the tenant is present must be flushed. ## Open questions diff --git a/docs/proposals-done/201909-thanos-sharding.md b/docs/proposals-done/201909-thanos-sharding.md index 3700bd5dc5..8c7786969c 100644 --- a/docs/proposals-done/201909-thanos-sharding.md +++ b/docs/proposals-done/201909-thanos-sharding.md @@ -131,7 +131,7 @@ Example usages would be: * Add/import relabel config into Thanos, add relevant logic. * Hook it for selecting blocks on Store Gateway - * Advertise original labels of "approved" blocs on resulted external labels. + * Advertise original labels of "approved" blocks on resulted external labels. * Hook it for selecting blocks on Compactor. * Add documentation about following concern: Care must be taken with changing selection for compactor to unsure only single compactor ever running over each Source's blocks. diff --git a/docs/proposals-done/202001-thanos-query-health-handling.md b/docs/proposals-done/202001-thanos-query-health-handling.md index 9585ec5cc7..1a404fbb83 100644 --- a/docs/proposals-done/202001-thanos-query-health-handling.md +++ b/docs/proposals-done/202001-thanos-query-health-handling.md @@ -35,7 +35,7 @@ Thus, this logic needs to be changed somehow. There are a few possible options: 2. Another option could be introduced such as `--store.hold-timeout` which would be `--store.unhealthy-timeout`'s brother and we would hold the StoreAPI nodes for `max(hold_timeout, unhealthy_timeout)`. 3. Another option such as `--store.strict-mode` could be introduced which means that we would always retain the last information of the StoreAPI nodes of the last successful check. 4. The StoreAPI node specification format that is used in `--store` could be extended to include another flag which would let specify the previous option per-specific node. -5. Instead of extending the specification format, we could move the same inforamtion to the command line options themselves. This would increase the explicitness of this new mode i.e. that it only applies to statically defined nodes. +5. Instead of extending the specification format, we could move the same information to the command line options themselves. This would increase the explicitness of this new mode i.e. that it only applies to statically defined nodes. Lets look through their pros and cons: diff --git a/docs/proposals-done/202203-grpc-query-api.md b/docs/proposals-done/202203-grpc-query-api.md index d3f6fd6dc1..26b0cc49ee 100644 --- a/docs/proposals-done/202203-grpc-query-api.md +++ b/docs/proposals-done/202203-grpc-query-api.md @@ -13,7 +13,7 @@ We want to be able to distinguish between gRPC Store APIs and other Queriers in This is useful for a few reasons: * When Queriers register disjoint Store targets, they should be able to deduplicate series and then execute the query without concerns of duplicate data from other queriers. This new API would enable users to effectively partition by Querier, and avoid shipping raw series back from each disjointed Querier to the root Querier. -* If Queriers register Store targets with overlapping series, users would be able to express a query sharding strategy between Queriers to more effectively distribute query load amongst a fleet of homogenous Queriers. +* If Queriers register Store targets with overlapping series, users would be able to express a query sharding strategy between Queriers to more effectively distribute query load amongst a fleet of homogeneous Queriers. * The proposed Query API utilizes gRPC instead of HTTP, which would enable gRPC streaming from root Querier all the way to the underlying Store targets (Query API -> Store API) and unlock the performance benefits of gRPC over HTTP. * When there is only one StoreAPI connected to Thanos Query which completely covers the requested range of the original user's query, then it is more optimal to execute the query directly in the store, instead of sending raw samples to the querier. This scenario is not unlikely given query-frontend's sharding capabilities. diff --git a/docs/proposals-done/202301-distributed-query-execution.md b/docs/proposals-done/202301-distributed-query-execution.md index c4d6984df7..b557c1705a 100644 --- a/docs/proposals-done/202301-distributed-query-execution.md +++ b/docs/proposals-done/202301-distributed-query-execution.md @@ -190,7 +190,7 @@ sum( The root querier would need to know that downstream queriers have already executed the `count` and should convert the aggregation into a `sum` -A similar problem can happen with a `sum(rate(metric[2m]))` expression where downstream queriers calculate the `sum` over the metric's `rate`. In order for the values to not get rated twice, either the downstream queriers need to invert the rate into a cumulative value, or the central querier needs to omit the rate and only calcualte the sum. +A similar problem can happen with a `sum(rate(metric[2m]))` expression where downstream queriers calculate the `sum` over the metric's `rate`. In order for the values to not get rated twice, either the downstream queriers need to invert the rate into a cumulative value, or the central querier needs to omit the rate and only calculate the sum. Managing this complexity in Thanos itself seems error prone and hard to maintain over time. As a result, this proposal suggests to localize the complexity into a single logical optimizer as suggested in the sections above. diff --git a/docs/release-process.md b/docs/release-process.md index 6aff7b50a0..7fba14d509 100644 --- a/docs/release-process.md +++ b/docs/release-process.md @@ -23,6 +23,8 @@ Release shepherd responsibilities: | Release | Time of first RC | Shepherd (GitHub handle) | |---------|------------------|-------------------------------| +| v0.36.0 | 2024.06.26 | `@MichaHoffmann` | +| v0.35.0 | 2024.04.09 | `@saswatamcode` | | v0.34.0 | 2024.01.14 | `@MichaHoffmann` | | v0.33.0 | 2023.10.24 | `@MichaHoffmann` | | v0.32.0 | 2023.08.23 | `@saswatamcode` | diff --git a/docs/storage.md b/docs/storage.md index 288959f52c..48033629a2 100644 --- a/docs/storage.md +++ b/docs/storage.md @@ -66,6 +66,7 @@ config: bucket: "" endpoint: "" region: "" + disable_dualstack: false aws_sdk_auth: false access_key: "" insecure: false @@ -94,6 +95,7 @@ config: list_objects_version: "" bucket_lookup_type: auto send_content_md5: true + disable_multipart: false part_size: 67108864 sse_config: type: "" @@ -101,6 +103,7 @@ config: kms_encryption_context: {} encryption_key: "" sts_endpoint: "" + max_retries: 0 prefix: "" ``` @@ -136,7 +139,7 @@ For debug and testing purposes you can set ##### S3 Server-Side Encryption -SSE can be configued using the `sse_config`. [SSE-S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html), [SSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html), and [SSE-C](https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html) are supported. +SSE can be configured using the `sse_config`. [SSE-S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html), [SSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html), and [SSE-C](https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html) are supported. * If type is set to `SSE-S3` you do not need to configure other options. @@ -302,6 +305,8 @@ config: server_name: "" insecure_skip_verify: false disable_compression: false + chunk_size_bytes: 0 + max_retries: 0 prefix: "" ``` @@ -377,6 +382,7 @@ config: storage_account: "" storage_account_key: "" storage_connection_string: "" + storage_create_container: false container: "" endpoint: "" user_assigned_id: "" @@ -491,6 +497,7 @@ config: endpoint: "" secret_key: "" secret_id: "" + max_retries: 0 http_config: idle_conn_timeout: 1m30s response_header_timeout: 2m diff --git a/docs/tracing.md b/docs/tracing.md index e87a1fa0f3..3e052fe84a 100644 --- a/docs/tracing.md +++ b/docs/tracing.md @@ -79,6 +79,7 @@ type: OTLP config: client_type: "" service_name: "" + resource_attributes: {} reconnection_period: 0s compression: "" insecure: false diff --git a/examples/alerts/alerts.md b/examples/alerts/alerts.md index caa89ad0ef..cfcba12fde 100644 --- a/examples/alerts/alerts.md +++ b/examples/alerts/alerts.md @@ -411,7 +411,7 @@ rules: severity: critical - alert: ThanosQueryOverload annotations: - description: Thanos Query {{$labels.job}} has been overloaded for more than 15 minutes. This may be a symptom of excessive simultanous complex requests, low performance of the Prometheus API, or failures within these components. Assess the health of the Thanos query instances, the connnected Prometheus instances, look for potential senders of these requests and then contact support. + description: Thanos Query {{$labels.job}} has been overloaded for more than 15 minutes. This may be a symptom of excessive simultaneous complex requests, low performance of the Prometheus API, or failures within these components. Assess the health of the Thanos query instances, the connected Prometheus instances, look for potential senders of these requests and then contact support. runbook_url: https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryoverload summary: Thanos query reaches its maximum capacity serving concurrent requests. expr: | diff --git a/examples/alerts/alerts.yaml b/examples/alerts/alerts.yaml index 0b1c0422b7..c66044700c 100644 --- a/examples/alerts/alerts.yaml +++ b/examples/alerts/alerts.yaml @@ -160,7 +160,7 @@ groups: severity: critical - alert: ThanosQueryOverload annotations: - description: Thanos Query {{$labels.job}} has been overloaded for more than 15 minutes. This may be a symptom of excessive simultanous complex requests, low performance of the Prometheus API, or failures within these components. Assess the health of the Thanos query instances, the connnected Prometheus instances, look for potential senders of these requests and then contact support. + description: Thanos Query {{$labels.job}} has been overloaded for more than 15 minutes. This may be a symptom of excessive simultaneous complex requests, low performance of the Prometheus API, or failures within these components. Assess the health of the Thanos query instances, the connected Prometheus instances, look for potential senders of these requests and then contact support. runbook_url: https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryoverload summary: Thanos query reaches its maximum capacity serving concurrent requests. expr: | diff --git a/examples/dashboards/receive.json b/examples/dashboards/receive.json index 39246cb054..cb9caa43b1 100644 --- a/examples/dashboards/receive.json +++ b/examples/dashboards/receive.json @@ -1365,7 +1365,7 @@ "dashLength": 10, "dashes": false, "datasource": "$datasource", - "description": "Shows ratio of errors compared to the total number of forwareded requests to other receive nodes.", + "description": "Shows ratio of errors compared to the total number of forwarded requests to other receive nodes.", "fill": 10, "id": 17, "legend": { diff --git a/go.mod b/go.mod index 60a4a9050b..9a725cb167 100644 --- a/go.mod +++ b/go.mod @@ -1,17 +1,17 @@ module github.com/thanos-io/thanos -go 1.21 +go 1.23.0 require ( - cloud.google.com/go/storage v1.36.0 // indirect - cloud.google.com/go/trace v1.10.5 + cloud.google.com/go/storage v1.43.0 // indirect + cloud.google.com/go/trace v1.10.12 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.8.3 - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 + github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 github.com/alicebob/miniredis/v2 v2.22.0 github.com/blang/semver/v4 v4.0.0 github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b github.com/cespare/xxhash v1.1.0 - github.com/cespare/xxhash/v2 v2.2.0 + github.com/cespare/xxhash/v2 v2.3.0 github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 github.com/chromedp/chromedp v0.9.2 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -20,11 +20,11 @@ require ( github.com/efficientgo/tools/extkingpin v0.0.0-20220817170617-6c25e3b627dd github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb github.com/fatih/structtag v1.2.0 - github.com/felixge/fgprof v0.9.2 + github.com/felixge/fgprof v0.9.5 github.com/fortytw2/leaktest v1.3.0 github.com/fsnotify/fsnotify v1.7.0 github.com/go-kit/log v0.2.1 - github.com/go-openapi/strfmt v0.22.2 + github.com/go-openapi/strfmt v0.23.0 github.com/gogo/protobuf v1.3.2 github.com/gogo/status v1.1.1 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da @@ -32,64 +32,62 @@ require ( github.com/golang/snappy v0.0.4 github.com/googleapis/gax-go v2.0.2+incompatible github.com/gorilla/mux v1.8.0 // indirect - github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd // indirect - github.com/grpc-ecosystem/go-grpc-middleware/providers/kit/v2 v2.0.0-20201002093600-73cf2ae9d891 - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.2.0.20201207153454-9f6bf00c00a7 - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 github.com/jpillora/backoff v1.0.0 github.com/json-iterator/go v1.1.12 - github.com/klauspost/compress v1.17.7 + github.com/klauspost/compress v1.17.11 github.com/leanovate/gopter v0.2.9 github.com/lightstep/lightstep-tracer-go v0.25.0 github.com/lovoo/gcloud-opentracing v0.3.0 - github.com/miekg/dns v1.1.58 - github.com/minio/minio-go/v7 v7.0.61 // indirect + github.com/miekg/dns v1.1.62 + github.com/minio/minio-go/v7 v7.0.80 // 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/olekukonko/tablewriter v0.0.5 github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e // indirect github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect - github.com/opentracing/basictracer-go v1.0.0 + github.com/opentracing/basictracer-go v1.1.0 github.com/opentracing/opentracing-go v1.2.0 github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/alertmanager v0.27.0 - github.com/prometheus/client_golang v1.19.0 - github.com/prometheus/client_model v0.6.0 - github.com/prometheus/common v0.49.1-0.20240306132007-4199f18c3e92 - github.com/prometheus/exporter-toolkit v0.11.0 + github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_model v0.6.1 + github.com/prometheus/common v0.60.0 + github.com/prometheus/exporter-toolkit v0.12.0 // Prometheus maps version 2.x.y to tags v0.x.y. - github.com/prometheus/prometheus v0.51.1-0.20240325140356-78c0fd2f4d75 + github.com/prometheus/prometheus v0.55.1-0.20241102120812-a6fd22b9d2c8 github.com/sony/gobreaker v0.5.0 github.com/stretchr/testify v1.9.0 - github.com/thanos-io/objstore v0.0.0-20240309075357-e8336a5fd5f3 - github.com/thanos-io/promql-engine v0.0.0-20240405095051-b7d0da367508 + github.com/thanos-io/objstore v0.0.0-20241111205755-d1dd89d41f97 + github.com/thanos-io/promql-engine v0.0.0-20241203103240-2f49f80c7c68 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/vimeo/galaxycache v0.0.0-20210323154928-b7e5d71c067a github.com/weaveworks/common v0.0.0-20230728070032-dd9e68f319d5 - go.elastic.co/apm v1.11.0 - go.elastic.co/apm/module/apmot v1.11.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect - go.opentelemetry.io/otel v1.24.0 - go.opentelemetry.io/otel/bridge/opentracing v1.21.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 - go.opentelemetry.io/otel/sdk v1.24.0 - go.opentelemetry.io/otel/trace v1.24.0 + go.elastic.co/apm v1.15.0 + go.elastic.co/apm/module/apmot v1.15.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect + go.opentelemetry.io/otel v1.31.0 + go.opentelemetry.io/otel/bridge/opentracing v1.31.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0 + go.opentelemetry.io/otel/sdk v1.29.0 + go.opentelemetry.io/otel/trace v1.31.0 go.uber.org/atomic v1.11.0 go.uber.org/automaxprocs v1.5.3 go.uber.org/goleak v1.3.0 - golang.org/x/crypto v0.32.0 - golang.org/x/net v0.34.0 - golang.org/x/sync v0.10.0 - golang.org/x/text v0.21.0 - golang.org/x/time v0.5.0 - google.golang.org/api v0.168.0 // indirect - google.golang.org/genproto v0.0.0-20240205150955-31a09d347014 // indirect - google.golang.org/grpc v1.62.1 + golang.org/x/crypto v0.28.0 + golang.org/x/net v0.30.0 + golang.org/x/sync v0.8.0 + golang.org/x/text v0.19.0 + golang.org/x/time v0.7.0 + google.golang.org/api v0.195.0 // indirect + google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c // indirect + google.golang.org/grpc v1.66.0 google.golang.org/grpc/examples v0.0.0-20211119005141-f45e61797429 gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/yaml.v2 v2.4.0 @@ -97,45 +95,58 @@ require ( ) require ( - github.com/efficientgo/core v1.0.0-rc.2 + github.com/efficientgo/core v1.0.0-rc.3 github.com/minio/sha256-simd v1.0.1 ) require ( - cloud.google.com/go v0.112.0 // indirect - cloud.google.com/go/compute v1.23.4 // indirect - cloud.google.com/go/iam v1.1.6 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 // indirect + cloud.google.com/go v0.115.1 // indirect + cloud.google.com/go/iam v1.1.13 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 // indirect - go.opentelemetry.io/contrib/samplers/jaegerremote v0.7.0 + github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 go.opentelemetry.io/otel/exporters/jaeger v1.16.0 ) require ( - github.com/cortexproject/promqlsmith v0.0.0-20240326071418-c2a9ca1e89f5 + capnproto.org/go/capnp/v3 v3.0.0-alpha.30 + github.com/cortexproject/promqlsmith v0.0.0-20240506042652-6cfdd9739a5e + github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/mitchellh/go-ps v1.0.0 - github.com/onsi/gomega v1.29.0 + github.com/onsi/gomega v1.34.0 github.com/prometheus-community/prom-label-proxy v0.8.1-0.20240127162815-c1195f9aabc0 - go.opentelemetry.io/contrib/propagators/autoprop v0.38.0 + github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 + go.opentelemetry.io/contrib/propagators/autoprop v0.54.0 go4.org/intern v0.0.0-20230525184215-6c62f75575cb - golang.org/x/exp v0.0.0-20240119083558-1b970713d09a + golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 ) +require github.com/dgryski/go-metro v0.0.0-20200812162917-85c65e2d0165 // indirect + require ( + cloud.google.com/go/auth v0.9.3 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect + github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect github.com/cilium/ebpf v0.11.0 // indirect github.com/containerd/cgroups/v3 v3.0.3 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/elastic/go-licenser v0.3.1 // indirect + github.com/go-ini/ini v1.67.0 // indirect github.com/go-openapi/runtime v0.27.1 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect - github.com/golang-jwt/jwt/v5 v5.2.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/google/s2a-go v0.1.8 // indirect github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.3+incompatible // indirect + github.com/jcchavezs/porto v0.1.0 // indirect + github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353 // indirect + github.com/mdlayher/socket v0.4.1 // indirect + github.com/mdlayher/vsock v1.2.1 // indirect github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/onsi/ginkgo v1.16.5 // indirect @@ -143,31 +154,32 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/sercand/kuberesolver/v4 v4.0.0 // indirect github.com/zhangyunhao116/umap v0.0.0-20221211160557-cb7705fafa39 // indirect - go.opentelemetry.io/collector/featuregate v1.3.0 // indirect - go.opentelemetry.io/collector/pdata v1.3.0 // indirect - go.opentelemetry.io/collector/semconv v0.96.0 // indirect + go.opentelemetry.io/collector/pdata v1.14.1 // indirect + go.opentelemetry.io/collector/semconv v0.108.1 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/propagators/ot v1.13.0 // indirect + go.opentelemetry.io/contrib/propagators/ot v1.29.0 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78 // indirect - k8s.io/apimachinery v0.29.3 // indirect - k8s.io/client-go v0.29.3 // indirect - k8s.io/klog/v2 v2.120.1 // indirect - k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + k8s.io/apimachinery v0.31.1 // indirect + k8s.io/client-go v0.31.0 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + zenhack.net/go/util v0.0.0-20230414204917-531d38494cf5 // indirect ) require ( - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/compute/metadata v0.5.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.32.3 // indirect - github.com/KimMachineGun/automemlimit v0.5.0 + github.com/KimMachineGun/automemlimit v0.6.1 github.com/OneOfOne/xxhash v1.2.6 // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible // indirect github.com/armon/go-radix v1.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go v1.50.32 // indirect + github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/aws/aws-sdk-go-v2 v1.16.0 // indirect github.com/aws/aws-sdk-go-v2/config v1.15.1 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.11.0 // indirect @@ -181,22 +193,23 @@ require ( github.com/aws/smithy-go v1.11.1 // indirect github.com/baidubce/bce-sdk-go v0.9.111 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/caio/go-tdigest v3.1.0+incompatible + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/chromedp/sysutil v1.0.0 // indirect github.com/clbanning/mxj v1.8.4 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/cristalhq/hedgedhttp v0.9.1 github.com/dennwc/varint v1.0.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/elastic/go-sysinfo v1.8.1 // indirect github.com/elastic/go-windows v1.0.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-kit/kit v0.12.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-openapi/analysis v0.22.2 // indirect - github.com/go-openapi/errors v0.21.1 // indirect + github.com/go-openapi/errors v0.22.0 // indirect github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/jsonreference v0.20.4 // indirect github.com/go-openapi/loads v0.21.5 // indirect @@ -210,16 +223,16 @@ require ( github.com/gogo/googleapis v1.4.0 // indirect github.com/google/go-cmp v0.6.0 github.com/google/go-querystring v1.1.0 // indirect - github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect + github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 // indirect github.com/google/uuid v1.6.0 - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/julienschmidt/httprouter v1.3.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20210210170715-a8dfcb80d3a7 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect @@ -235,10 +248,10 @@ require ( github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect - github.com/redis/rueidis v1.0.14-go1.18 + github.com/prometheus/procfs v0.15.1 // indirect + github.com/redis/rueidis v1.0.45-alpha.1 github.com/rivo/uniseg v0.2.0 // indirect - github.com/rs/xid v1.5.0 // indirect + github.com/rs/xid v1.6.0 // indirect github.com/santhosh-tekuri/jsonschema v1.2.4 // indirect github.com/shirou/gopsutil/v3 v3.22.9 // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -250,24 +263,22 @@ require ( github.com/weaveworks/promrus v1.2.0 // indirect github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.elastic.co/apm/module/apmhttp v1.11.0 // indirect + go.elastic.co/apm/module/apmhttp v1.15.0 // indirect go.elastic.co/fastjson v1.1.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/propagators/aws v1.13.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.13.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.13.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/proto/otlp v1.1.0 // indirect + go.opentelemetry.io/contrib/propagators/aws v1.29.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.29.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/oauth2 v0.18.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - gonum.org/v1/gonum v0.12.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/protobuf v1.33.0 - gopkg.in/ini.v1 v1.67.0 // indirect + golang.org/x/mod v0.21.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/tools v0.24.0 // indirect + gonum.org/v1/gonum v0.15.0 // indirect + google.golang.org/protobuf v1.35.1 howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect ) @@ -276,15 +287,14 @@ replace ( // Required by Cortex https://github.com/cortexproject/cortex/pull/3051. github.com/bradfitz/gomemcache => github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab + // Pin kuberesolver/v5 to support new grpc version. Need to upgrade kuberesolver version on weaveworks/common. + github.com/sercand/kuberesolver/v4 => github.com/sercand/kuberesolver/v5 v5.1.1 + github.com/vimeo/galaxycache => github.com/thanos-community/galaxycache v0.0.0-20211122094458-3a32041a1f1e - // Override due to https://github.com/weaveworks/common/issues/239 - google.golang.org/grpc => google.golang.org/grpc v1.57.2 + // Pinning grpc due https://github.com/grpc/grpc-go/issues/7314 + google.golang.org/grpc => google.golang.org/grpc v1.63.2 // Overriding to use latest commit. gopkg.in/alecthomas/kingpin.v2 => github.com/alecthomas/kingpin v1.3.8-0.20210301060133-17f40c25f497 - - // From Prometheus. - k8s.io/klog => github.com/simonpasquier/klog-gokit v0.3.0 - k8s.io/klog/v2 => github.com/simonpasquier/klog-gokit/v3 v3.0.0 ) diff --git a/go.sum b/go.sum index 65f8d5a43c..9933abda40 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +capnproto.org/go/capnp/v3 v3.0.0-alpha.30 h1:iABQan/YiHFCgSXym5aNj27osapnEgAk4WaWYqb4sQM= +capnproto.org/go/capnp/v3 v3.0.0-alpha.30/go.mod h1:+ysMHvOh1EWNOyorxJWs1omhRFiDoKxKkWQACp54jKM= 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= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= @@ -35,35 +37,89 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.110.9/go.mod h1:rpxevX/0Lqvlbc88b7Sc1SPNdyK1riNBTUU6JXhYNpM= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go v0.111.0/go.mod h1:0mibmpKP1TyOOFYQY5izo0LnT+ecvOQ0Sg3OdmMiNRU= cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accessapproval v1.7.2/go.mod h1:/gShiq9/kK/h8T/eEn1BTzalDvk0mZxJlhfw0p+Xuc0= +cloud.google.com/go/accessapproval v1.7.3/go.mod h1:4l8+pwIxGTNqSf4T3ds8nLO94NQf0W/KnMNuQ9PbnP8= +cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= +cloud.google.com/go/accessapproval v1.7.5/go.mod h1:g88i1ok5dvQ9XJsxpUInWWvUBrIZhyPDPbk4T01OoJ0= cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/accesscontextmanager v1.8.2/go.mod h1:E6/SCRM30elQJ2PKtFMs2YhfJpZSNcJyejhuzoId4Zk= +cloud.google.com/go/accesscontextmanager v1.8.3/go.mod h1:4i/JkF2JiFbhLnnpnfoTX5vRXfhf9ukhU1ANOTALTOQ= +cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= +cloud.google.com/go/accesscontextmanager v1.8.5/go.mod h1:TInEhcZ7V9jptGNqN3EzZ5XMhT6ijWxTGjzyETwmL0Q= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.50.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= +cloud.google.com/go/aiplatform v1.51.0/go.mod h1:IRc2b8XAMTa9ZmfJV1BCCQbieWWvDnP1A8znyz5N7y4= +cloud.google.com/go/aiplatform v1.51.1/go.mod h1:kY3nIMAVQOK2XDqDPHaOuD9e+FdMA6OOpfBjsvaFSOo= +cloud.google.com/go/aiplatform v1.51.2/go.mod h1:hCqVYB3mY45w99TmetEoe8eCQEwZEp9WHxeZdcv9phw= +cloud.google.com/go/aiplatform v1.52.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/aiplatform v1.57.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/aiplatform v1.58.2/go.mod h1:c3kCiVmb6UC1dHAjZjcpDj6ZS0bHQ2slL88ZjC2LtlA= +cloud.google.com/go/aiplatform v1.60.0/go.mod h1:eTlGuHOahHprZw3Hio5VKmtThIOak5/qy6pzdsqcQnM= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.4/go.mod h1:zZgNCxLCy8b2rKKVfC1YkC2vTrpfZmeRCySM3aUbskA= +cloud.google.com/go/analytics v0.21.5/go.mod h1:BQtOBHWTlJ96axpPPnw5CvGJ6i3Ve/qX2fTxR8qWyr8= +cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= +cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= +cloud.google.com/go/analytics v0.23.0/go.mod h1:YPd7Bvik3WS95KBok2gPXDqQPHy08TsCQG6CdUCb+u0= cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigateway v1.6.2/go.mod h1:CwMC90nnZElorCW63P2pAYm25AtQrHfuOkbRSHj0bT8= +cloud.google.com/go/apigateway v1.6.3/go.mod h1:k68PXWpEs6BVDTtnLQAyG606Q3mz8pshItwPXjgv44Y= +cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= +cloud.google.com/go/apigateway v1.6.5/go.mod h1:6wCwvYRckRQogyDDltpANi3zsCDl6kWi0b4Je+w2UiI= cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeconnect v1.6.2/go.mod h1:s6O0CgXT9RgAxlq3DLXvG8riw8PYYbU/v25jqP3Dy18= +cloud.google.com/go/apigeeconnect v1.6.3/go.mod h1:peG0HFQ0si2bN15M6QSjEW/W7Gy3NYkWGz7pFz13cbo= +cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= +cloud.google.com/go/apigeeconnect v1.6.5/go.mod h1:MEKm3AiT7s11PqTfKE3KZluZA9O91FNysvd3E6SJ6Ow= cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apigeeregistry v0.7.2/go.mod h1:9CA2B2+TGsPKtfi3F7/1ncCCsL62NXBRfM6iPoGSM+8= +cloud.google.com/go/apigeeregistry v0.8.1/go.mod h1:MW4ig1N4JZQsXmBSwH4rwpgDonocz7FPBSw6XPGHmYw= +cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= +cloud.google.com/go/apigeeregistry v0.8.3/go.mod h1:aInOWnqF4yMQx8kTjDqHNXjZGh/mxeNlAf52YqtASUs= cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= @@ -72,10 +128,20 @@ cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodC cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/appengine v1.8.2/go.mod h1:WMeJV9oZ51pvclqFN2PqHoGnys7rK0rz6s3Mp6yMvDo= +cloud.google.com/go/appengine v1.8.3/go.mod h1:2oUPZ1LVZ5EXi+AF1ihNAF+S8JrzQ3till5m9VQkrsk= +cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= +cloud.google.com/go/appengine v1.8.5/go.mod h1:uHBgNoGLTS5di7BvU25NFDuKa82v0qQLjyMJLuPQrVo= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/area120 v0.8.2/go.mod h1:a5qfo+x77SRLXnCynFWPUZhnZGeSgvQ+Y0v1kSItkh4= +cloud.google.com/go/area120 v0.8.3/go.mod h1:5zj6pMzVTH+SVHljdSKC35sriR/CVvQZzG/Icdyriw0= +cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= +cloud.google.com/go/area120 v0.8.5/go.mod h1:BcoFCbDLZjsfe4EkCnEq1LKvHSK0Ew/zk5UFu6GMyA0= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= @@ -84,6 +150,12 @@ cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1 cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/artifactregistry v1.14.2/go.mod h1:Xk+QbsKEb0ElmyeMfdHAey41B+qBq3q5R5f5xD4XT3U= +cloud.google.com/go/artifactregistry v1.14.3/go.mod h1:A2/E9GXnsyXl7GUvQ/2CjHA+mVRoWAXC0brg2os+kNI= +cloud.google.com/go/artifactregistry v1.14.4/go.mod h1:SJJcZTMv6ce0LDMUnihCN7WSrI+kBSFV0KIKo8S8aYU= +cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= +cloud.google.com/go/artifactregistry v1.14.7/go.mod h1:0AUKhzWQzfmeTvT4SjfI4zjot72EMfrkvL9g9aRjnnM= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= @@ -92,27 +164,70 @@ cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAt cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/asset v1.15.0/go.mod h1:tpKafV6mEut3+vN9ScGvCHXHj7FALFVta+okxFECHcg= +cloud.google.com/go/asset v1.15.1/go.mod h1:yX/amTvFWRpp5rcFq6XbCxzKT8RJUam1UoboE179jU4= +cloud.google.com/go/asset v1.15.2/go.mod h1:B6H5tclkXvXz7PD22qCA2TDxSVQfasa3iDlM89O2NXs= +cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= +cloud.google.com/go/asset v1.16.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= +cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= +cloud.google.com/go/asset v1.17.1/go.mod h1:byvDw36UME5AzGNK7o4JnOnINkwOZ1yRrGrKIahHrng= +cloud.google.com/go/asset v1.17.2/go.mod h1:SVbzde67ehddSoKf5uebOD1sYw8Ab/jD/9EIeWg99q4= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/assuredworkloads v1.11.2/go.mod h1:O1dfr+oZJMlE6mw0Bp0P1KZSlj5SghMBvTpZqIcUAW4= +cloud.google.com/go/assuredworkloads v1.11.3/go.mod h1:vEjfTKYyRUaIeA0bsGJceFV2JKpVRgyG2op3jfa59Zs= +cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= +cloud.google.com/go/assuredworkloads v1.11.5/go.mod h1:FKJ3g3ZvkL2D7qtqIGnDufFkHxwIpNM9vtmhvt+6wqk= +cloud.google.com/go/auth v0.9.3 h1:VOEUIAADkkLtyfr3BLa3R8Ed/j6w1jTBmARx+wb5w5U= +cloud.google.com/go/auth v0.9.3/go.mod h1:7z6VY+7h3KUdRov5F1i8NDP5ZzWKYmEPO842BgCsmTk= +cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= +cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/automl v1.13.2/go.mod h1:gNY/fUmDEN40sP8amAX3MaXkxcqPIn7F1UIIPZpy4Mg= +cloud.google.com/go/automl v1.13.3/go.mod h1:Y8KwvyAZFOsMAPqUCfNu1AyclbC6ivCUF/MTwORymyY= +cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= +cloud.google.com/go/automl v1.13.5/go.mod h1:MDw3vLem3yh+SvmSgeYUmUKqyls6NzSumDm9OJ3xJ1Y= cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/baremetalsolution v1.2.0/go.mod h1:68wi9AwPYkEWIUT4SvSGS9UJwKzNpshjHsH4lzk8iOw= +cloud.google.com/go/baremetalsolution v1.2.1/go.mod h1:3qKpKIw12RPXStwQXcbhfxVj1dqQGEvcmA+SX/mUR88= +cloud.google.com/go/baremetalsolution v1.2.2/go.mod h1:O5V6Uu1vzVelYahKfwEWRMaS3AbCkeYHy3145s1FkhM= +cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= +cloud.google.com/go/baremetalsolution v1.2.4/go.mod h1:BHCmxgpevw9IEryE99HbYEfxXkAEA3hkMJbYYsHtIuY= cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/batch v1.4.1/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= +cloud.google.com/go/batch v1.5.0/go.mod h1:KdBmDD61K0ovcxoRHGrN6GmOBWeAOyCgKD0Mugx4Fkk= +cloud.google.com/go/batch v1.5.1/go.mod h1:RpBuIYLkQu8+CWDk3dFD/t/jOCGuUpkpX+Y0n1Xccs8= +cloud.google.com/go/batch v1.6.1/go.mod h1:urdpD13zPe6YOK+6iZs/8/x2VBRofvblLpx0t57vM98= +cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/batch v1.8.0/go.mod h1:k8V7f6VE2Suc0zUM4WtoibNrA6D3dqBpB+++e3vSGYc= cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.1/go.mod h1:zl/rWWAFVeV+kx+X2Javly7o1EIQThU4WlkynffL/lk= +cloud.google.com/go/beyondcorp v1.0.2/go.mod h1:m8cpG7caD+5su+1eZr+TSvF6r21NdLJk4f9u4SP2Ntc= +cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= +cloud.google.com/go/beyondcorp v1.0.4/go.mod h1:Gx8/Rk2MxrvWfn4WIhHIG1NV7IBfg14pTKv1+EArVcc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -126,38 +241,92 @@ cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/Zur cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.55.0/go.mod h1:9Y5I3PN9kQWuid6183JFhOGOW3GcirA5LpsKCUn+2ec= +cloud.google.com/go/bigquery v1.56.0/go.mod h1:KDcsploXTEY7XT3fDQzMUZlpQLHzE4itubHrnmhUrZA= +cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= +cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik= +cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/billing v1.17.0/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= +cloud.google.com/go/billing v1.17.1/go.mod h1:Z9+vZXEq+HwH7bhJkyI4OQcR6TSbeMrjlpEjO2vzY64= +cloud.google.com/go/billing v1.17.2/go.mod h1:u/AdV/3wr3xoRBk5xvUzYMS1IawOAPwQMuHgHMdljDg= +cloud.google.com/go/billing v1.17.3/go.mod h1:z83AkoZ7mZwBGT3yTnt6rSGI1OOsHSIi6a5M3mJ8NaU= +cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= +cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= +cloud.google.com/go/billing v1.18.2/go.mod h1:PPIwVsOOQ7xzbADCwNe8nvK776QpfrOAUkvKjCUcpSE= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/binaryauthorization v1.7.0/go.mod h1:Zn+S6QqTMn6odcMU1zDZCJxPjU2tZPV1oDl45lWY154= +cloud.google.com/go/binaryauthorization v1.7.1/go.mod h1:GTAyfRWYgcbsP3NJogpV3yeunbUIjx2T9xVeYovtURE= +cloud.google.com/go/binaryauthorization v1.7.2/go.mod h1:kFK5fQtxEp97m92ziy+hbu+uKocka1qRRL8MVJIgjv0= +cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/binaryauthorization v1.8.1/go.mod h1:1HVRyBerREA/nhI7yLang4Zn7vfNVA3okoAR9qYQJAQ= cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/certificatemanager v1.7.2/go.mod h1:15SYTDQMd00kdoW0+XY5d9e+JbOPjp24AvF48D8BbcQ= +cloud.google.com/go/certificatemanager v1.7.3/go.mod h1:T/sZYuC30PTag0TLo28VedIRIj1KPGcOQzjWAptHa00= +cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= +cloud.google.com/go/certificatemanager v1.7.5/go.mod h1:uX+v7kWqy0Y3NG/ZhNvffh0kuqkKZIXdvlZRO7z0VtM= cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/channel v1.17.0/go.mod h1:RpbhJsGi/lXWAUM1eF4IbQGbsfVlg2o8Iiy2/YLfVT0= +cloud.google.com/go/channel v1.17.1/go.mod h1:xqfzcOZAcP4b/hUDH0GkGg1Sd5to6di1HOJn/pi5uBQ= +cloud.google.com/go/channel v1.17.2/go.mod h1:aT2LhnftnyfQceFql5I/mP8mIbiiJS4lWqgXA815zMk= +cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= +cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= +cloud.google.com/go/channel v1.17.5/go.mod h1:FlpaOSINDAXgEext0KMaBq/vwpLMkkPAw9b2mApQeHc= cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.14.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.14.1/go.mod h1:K7wGc/3zfvmYWOWwYTgF/d/UVJhS4pu+HAy7PL7mCsU= +cloud.google.com/go/cloudbuild v1.14.2/go.mod h1:Bn6RO0mBYk8Vlrt+8NLrru7WXlQ9/RDWz2uo5KG1/sg= +cloud.google.com/go/cloudbuild v1.14.3/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= +cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= +cloud.google.com/go/cloudbuild v1.15.1/go.mod h1:gIofXZSu+XD2Uy+qkOrGKEx45zd7s28u/k8f99qKals= cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/clouddms v1.7.0/go.mod h1:MW1dC6SOtI/tPNCciTsXtsGNEM0i0OccykPvv3hiYeM= +cloud.google.com/go/clouddms v1.7.1/go.mod h1:o4SR8U95+P7gZ/TX+YbJxehOCsM+fe6/brlrFquiszk= +cloud.google.com/go/clouddms v1.7.2/go.mod h1:Rk32TmWmHo64XqDvW7jgkFQet1tUKNVzs7oajtJT3jU= +cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= +cloud.google.com/go/clouddms v1.7.4/go.mod h1:RdrVqoFG9RWI5AvZ81SxJ/xvxPdtcRhFotwdE79DieY= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.2/go.mod h1:A7nYkjNlW2gUoROg1kvJrQGhJP/38UaWwsnuBDOBVUk= +cloud.google.com/go/cloudtasks v1.12.3/go.mod h1:GPVXhIOSGEaR+3xT4Fp72ScI+HjHffSS4B8+BaBB5Ys= +cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= +cloud.google.com/go/cloudtasks v1.12.6/go.mod h1:b7c7fe4+TJsFZfDyzO51F7cjq7HLUlRi/KZQLQjDsaY= 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= @@ -171,26 +340,57 @@ cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARy cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.23.4 h1:EBT9Nw4q3zyE7G45Wvv3MzolIrCJEuHys5muLY0wvAw= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= +cloud.google.com/go/compute v1.23.2/go.mod h1:JJ0atRC0J/oWYiiVBmsSsrRnh92DhZPG4hFDcR04Rns= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute v1.23.4/go.mod h1:/EJMj55asU6kAFnuZET8zqgwgJ9FvXWXOkkfQZa4ioI= +cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.11.0/go.mod h1:hutBdImE4XNZ1NV4vbPJKSFOnQruhC5Lj9bZqWMTKiU= +cloud.google.com/go/contactcenterinsights v1.11.1/go.mod h1:FeNP3Kg8iteKM80lMwSk3zZZKVxr+PGnAId6soKuXwE= +cloud.google.com/go/contactcenterinsights v1.11.2/go.mod h1:A9PIR5ov5cRcd28KlDbmmXE8Aay+Gccer2h4wzkYFso= +cloud.google.com/go/contactcenterinsights v1.11.3/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/contactcenterinsights v1.13.0/go.mod h1:ieq5d5EtHsu8vhe2y3amtZ+BE+AQwX5qAy7cpo0POsI= cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.26.0/go.mod h1:YJCmRet6+6jnYYRS000T6k0D0xUXQgBSaJ7VwI8FBj4= +cloud.google.com/go/container v1.26.1/go.mod h1:5smONjPRUxeEpDG7bMKWfDL4sauswqEtnBK1/KKpR04= +cloud.google.com/go/container v1.26.2/go.mod h1:YlO84xCt5xupVbLaMY4s3XNE79MUJ+49VmkInr6HvF4= +cloud.google.com/go/container v1.27.1/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/container v1.30.1/go.mod h1:vkbfX0EnAKL/vgVECs5BZn24e1cJROzgszJirRKQ4Bg= +cloud.google.com/go/container v1.31.0/go.mod h1:7yABn5s3Iv3lmw7oMmyGbeV6tQj86njcTijkkGuvdZA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/containeranalysis v0.11.0/go.mod h1:4n2e99ZwpGxpNcz+YsFT1dfOHPQFGcAC8FN2M2/ne/U= +cloud.google.com/go/containeranalysis v0.11.1/go.mod h1:rYlUOM7nem1OJMKwE1SadufX0JP3wnXj844EtZAwWLY= +cloud.google.com/go/containeranalysis v0.11.2/go.mod h1:xibioGBC1MD2j4reTyV1xY1/MvKaz+fyM9ENWhmIeP8= +cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= +cloud.google.com/go/containeranalysis v0.11.4/go.mod h1:cVZT7rXYBS9NG1rhQbWL9pWbXCKHWJPYraE8/FTSYPE= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= @@ -199,44 +399,118 @@ cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOX cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.17.1/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= +cloud.google.com/go/datacatalog v1.18.0/go.mod h1:nCSYFHgtxh2MiEktWIz71s/X+7ds/UT9kp0PC7waCzE= +cloud.google.com/go/datacatalog v1.18.1/go.mod h1:TzAWaz+ON1tkNr4MOcak8EBHX7wIRX/gZKM+yTVsv+A= +cloud.google.com/go/datacatalog v1.18.2/go.mod h1:SPVgWW2WEMuWHA+fHodYjmxPiMqcOiWfhc9OD5msigk= +cloud.google.com/go/datacatalog v1.18.3/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= +cloud.google.com/go/datacatalog v1.19.3/go.mod h1:ra8V3UAsciBpJKQ+z9Whkxzxv7jmQg1hfODr3N3YPJ4= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataflow v0.9.2/go.mod h1:vBfdBZ/ejlTaYIGB3zB4T08UshH70vbtZeMD+urnUSo= +cloud.google.com/go/dataflow v0.9.3/go.mod h1:HI4kMVjcHGTs3jTHW/kv3501YW+eloiJSLxkJa/vqFE= +cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= +cloud.google.com/go/dataflow v0.9.5/go.mod h1:udl6oi8pfUHnL0z6UN9Lf9chGqzDMVqcYTcZ1aPnCZQ= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/dataform v0.8.2/go.mod h1:X9RIqDs6NbGPLR80tnYoPNiO1w0wenKTb8PxxlhTMKM= +cloud.google.com/go/dataform v0.8.3/go.mod h1:8nI/tvv5Fso0drO3pEjtowz58lodx8MVkdV2q0aPlqg= +cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= +cloud.google.com/go/dataform v0.9.2/go.mod h1:S8cQUwPNWXo7m/g3DhWHsLBoufRNn9EgFrMgne2j7cI= cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datafusion v1.7.2/go.mod h1:62K2NEC6DRlpNmI43WHMWf9Vg/YvN6QVi8EVwifElI0= +cloud.google.com/go/datafusion v1.7.3/go.mod h1:eoLt1uFXKGBq48jy9LZ+Is8EAVLnmn50lNncLzwYokE= +cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= +cloud.google.com/go/datafusion v1.7.5/go.mod h1:bYH53Oa5UiqahfbNK9YuYKteeD4RbQSNMx7JF7peGHc= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/datalabeling v0.8.2/go.mod h1:cyDvGHuJWu9U/cLDA7d8sb9a0tWLEletStu2sTmg3BE= +cloud.google.com/go/datalabeling v0.8.3/go.mod h1:tvPhpGyS/V7lqjmb3V0TaDdGvhzgR1JoW7G2bpi2UTI= +cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= +cloud.google.com/go/datalabeling v0.8.5/go.mod h1:IABB2lxQnkdUbMnQaOl2prCOfms20mcPxDBm36lps+s= cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.10.1/go.mod h1:1MzmBv8FvjYfc7vDdxhnLFNskikkB+3vl475/XdCDhs= +cloud.google.com/go/dataplex v1.10.2/go.mod h1:xdC8URdTrCrZMW6keY779ZT1cTOfV8KEPNsw+LTRT1Y= +cloud.google.com/go/dataplex v1.11.1/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataplex v1.13.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataplex v1.14.1/go.mod h1:bWxQAbg6Smg+sca2+Ex7s8D9a5qU6xfXtwmq4BVReps= +cloud.google.com/go/dataplex v1.14.2/go.mod h1:0oGOSFlEKef1cQeAHXy4GZPB/Ife0fz/PxBf+ZymA2U= cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataproc/v2 v2.2.0/go.mod h1:lZR7AQtwZPvmINx5J87DSOOpTfof9LVZju6/Qo4lmcY= +cloud.google.com/go/dataproc/v2 v2.2.1/go.mod h1:QdAJLaBjh+l4PVlVZcmrmhGccosY/omC1qwfQ61Zv/o= +cloud.google.com/go/dataproc/v2 v2.2.2/go.mod h1:aocQywVmQVF4i8CL740rNI/ZRpsaaC1Wh2++BJ7HEJ4= +cloud.google.com/go/dataproc/v2 v2.2.3/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= +cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= +cloud.google.com/go/dataproc/v2 v2.4.0/go.mod h1:3B1Ht2aRB8VZIteGxQS/iNSJGzt9+CA0WGnDVMEm7Z4= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/dataqna v0.8.2/go.mod h1:KNEqgx8TTmUipnQsScOoDpq/VlXVptUqVMZnt30WAPs= +cloud.google.com/go/dataqna v0.8.3/go.mod h1:wXNBW2uvc9e7Gl5k8adyAMnLush1KVV6lZUhB+rqNu4= +cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= +cloud.google.com/go/dataqna v0.8.5/go.mod h1:vgihg1mz6n7pb5q2YJF7KlXve6tCglInd6XO0JGOlWM= 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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.14.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.1/go.mod h1:7ngSYwnw95YFyTd5tOGBxHlOZiL+OtpjheqU7t2/s/c= +cloud.google.com/go/datastream v1.10.2/go.mod h1:W42TFgKAs/om6x/CdXX5E4oiAsKlH+e8MTGy81zdYt0= +cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= +cloud.google.com/go/datastream v1.10.4/go.mod h1:7kRxPdxZxhPg3MFeCSulmAJnil8NJGGvSNdn4p1sRZo= cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.1/go.mod h1:8jeadyLkH9qu9xgO3hVWw8jVr29N1mnW42gRJT8GY6g= +cloud.google.com/go/deploy v1.14.1/go.mod h1:N8S0b+aIHSEeSr5ORVoC0+/mOPUysVt8ae4QkZYolAw= +cloud.google.com/go/deploy v1.14.2/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/deploy v1.16.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= +cloud.google.com/go/deploy v1.17.1/go.mod h1:SXQyfsXrk0fBmgBHRzBjQbZhMfKZ3hMQBw5ym7MN/50= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= @@ -245,35 +519,94 @@ cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFM cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.43.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= +cloud.google.com/go/dialogflow v1.44.0/go.mod h1:pDUJdi4elL0MFmt1REMvFkdsUTYSHq+rTCS8wg0S3+M= +cloud.google.com/go/dialogflow v1.44.1/go.mod h1:n/h+/N2ouKOO+rbe/ZnI186xImpqvCVj2DdsWS/0EAk= +cloud.google.com/go/dialogflow v1.44.2/go.mod h1:QzFYndeJhpVPElnFkUXxdlptx0wPnBWLCBT9BvtC3/c= +cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dialogflow v1.47.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dialogflow v1.48.0/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= +cloud.google.com/go/dialogflow v1.48.2/go.mod h1:7A2oDf6JJ1/+hdpnFRfb/RjJUOh2X3rhIa5P8wQSEX4= +cloud.google.com/go/dialogflow v1.49.0/go.mod h1:dhVrXKETtdPlpPhE7+2/k4Z8FRNUp6kMV3EW3oz/fe0= cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/dlp v1.10.2/go.mod h1:ZbdKIhcnyhILgccwVDzkwqybthh7+MplGC3kZVZsIOQ= +cloud.google.com/go/dlp v1.10.3/go.mod h1:iUaTc/ln8I+QT6Ai5vmuwfw8fqTk2kaz0FvCwhLCom0= +cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= +cloud.google.com/go/dlp v1.11.2/go.mod h1:9Czi+8Y/FegpWzgSfkRlyz+jwW6Te9Rv26P3UfU/h/w= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.1/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= +cloud.google.com/go/documentai v1.23.0/go.mod h1:LKs22aDHbJv7ufXuPypzRO7rG3ALLJxzdCXDPutw4Qc= +cloud.google.com/go/documentai v1.23.2/go.mod h1:Q/wcRT+qnuXOpjAkvOV4A+IeQl04q2/ReT7SSbytLSo= +cloud.google.com/go/documentai v1.23.4/go.mod h1:4MYAaEMnADPN1LPN5xboDR5QVB6AgsaxgFdJhitlE2Y= +cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/documentai v1.23.6/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/documentai v1.23.8/go.mod h1:Vd/y5PosxCpUHmwC+v9arZyeMfTqBR9VIwOwIqQYYfA= +cloud.google.com/go/documentai v1.25.0/go.mod h1:ftLnzw5VcXkLItp6pw1mFic91tMRyfv6hHEY5br4KzY= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/domains v0.9.2/go.mod h1:3YvXGYzZG1Temjbk7EyGCuGGiXHJwVNmwIf+E/cUp5I= +cloud.google.com/go/domains v0.9.3/go.mod h1:29k66YNDLDY9LCFKpGFeh6Nj9r62ZKm5EsUJxAl84KU= +cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= +cloud.google.com/go/domains v0.9.5/go.mod h1:dBzlxgepazdFhvG7u23XMhmMKBjrkoUNaw0A8AQB55Y= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/edgecontainer v1.1.2/go.mod h1:wQRjIzqxEs9e9wrtle4hQPSR1Y51kqN75dgF7UllZZ4= +cloud.google.com/go/edgecontainer v1.1.3/go.mod h1:Ll2DtIABzEfaxaVSbwj3QHFaOOovlDFiWVDu349jSsA= +cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= +cloud.google.com/go/edgecontainer v1.1.5/go.mod h1:rgcjrba3DEDEQAidT4yuzaKWTbkTI5zAMu3yy6ZWS0M= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/essentialcontacts v1.6.3/go.mod h1:yiPCD7f2TkP82oJEFXFTou8Jl8L6LBRPeBEkTaO0Ggo= +cloud.google.com/go/essentialcontacts v1.6.4/go.mod h1:iju5Vy3d9tJUg0PYMd1nHhjV7xoCXaOAVabrwLaPBEM= +cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= +cloud.google.com/go/essentialcontacts v1.6.6/go.mod h1:XbqHJGaiH0v2UvtuucfOzFXN+rpL/aU5BCZLn4DYl1Q= cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.1/go.mod h1:EqBxmGHFrruIara4FUQ3RHlgfCn7yo1HYsu2Hpt/C3Y= +cloud.google.com/go/eventarc v1.13.2/go.mod h1:X9A80ShVu19fb4e5sc/OLV7mpFUKZMwfJFeeWhcIObM= +cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= +cloud.google.com/go/eventarc v1.13.4/go.mod h1:zV5sFVoAa9orc/52Q+OuYUG9xL2IIZTbbuTHC6JSY8s= cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/filestore v1.7.2/go.mod h1:TYOlyJs25f/omgj+vY7/tIG/E7BX369triSPzE4LdgE= +cloud.google.com/go/filestore v1.7.3/go.mod h1:Qp8WaEERR3cSkxToxFPHh/b8AACkSut+4qlCjAmKTV0= +cloud.google.com/go/filestore v1.7.4/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= +cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= +cloud.google.com/go/filestore v1.8.1/go.mod h1:MbN9KcaM47DRTIuLfQhJEsjaocVebNtNQhSLhKCF5GM= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/firestore v1.12.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/firestore v1.13.0/go.mod h1:QojqqOh8IntInDUSTAh0c8ZsPYAr68Ma8c5DWOy8xb8= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= @@ -281,28 +614,64 @@ cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5Uwt cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/functions v1.15.2/go.mod h1:CHAjtcR6OU4XF2HuiVeriEdELNcnvRZSk1Q8RMqy4lE= +cloud.google.com/go/functions v1.15.3/go.mod h1:r/AMHwBheapkkySEhiZYLDBwVJCdlRwsm4ieJu35/Ug= +cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= +cloud.google.com/go/functions v1.16.0/go.mod h1:nbNpfAG7SG7Duw/o1iZ6ohvL7mc6MapWQVpqtM29n8k= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkebackup v1.3.1/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkebackup v1.3.2/go.mod h1:OMZbXzEJloyXMC7gqdSB+EOEQ1AKcpGYvO3s1ec5ixk= +cloud.google.com/go/gkebackup v1.3.3/go.mod h1:eMk7/wVV5P22KBakhQnJxWSVftL1p4VBFLpv0kIft7I= +cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= +cloud.google.com/go/gkebackup v1.3.5/go.mod h1:KJ77KkNN7Wm1LdMopOelV6OodM01pMuK2/5Zt1t4Tvc= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkeconnect v0.8.2/go.mod h1:6nAVhwchBJYgQCXD2pHBFQNiJNyAd/wyxljpaa6ZPrY= +cloud.google.com/go/gkeconnect v0.8.3/go.mod h1:i9GDTrfzBSUZGCe98qSu1B8YB8qfapT57PenIb820Jo= +cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= +cloud.google.com/go/gkeconnect v0.8.5/go.mod h1:LC/rS7+CuJ5fgIbXv8tCD/mdfnlAadTaUufgOkmijuk= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkehub v0.14.2/go.mod h1:iyjYH23XzAxSdhrbmfoQdePnlMj2EWcvnR+tHdBQsCY= +cloud.google.com/go/gkehub v0.14.3/go.mod h1:jAl6WafkHHW18qgq7kqcrXYzN08hXeK/Va3utN8VKg8= +cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= +cloud.google.com/go/gkehub v0.14.5/go.mod h1:6bzqxM+a+vEH/h8W8ec4OJl4r36laxTs3A/fMNHJ0wA= cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.1/go.mod h1:AcrGoin6VLKT/fwZEYuqvVominLriQBCKmbjtnbMjG8= +cloud.google.com/go/gkemulticloud v1.0.2/go.mod h1:+ee5VXxKb3H1l4LZAcgWB/rvI16VTNTrInWxDjAGsGo= +cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/gkemulticloud v1.1.1/go.mod h1:C+a4vcHlWeEIf45IB5FFR5XGjTeYhF83+AYIpTy4i2Q= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc= cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/gsuiteaddons v1.6.2/go.mod h1:K65m9XSgs8hTF3X9nNTPi8IQueljSdYo9F+Mi+s4MyU= +cloud.google.com/go/gsuiteaddons v1.6.3/go.mod h1:sCFJkZoMrLZT3JTb8uJqgKPNshH2tfXeCwTFRebTq48= +cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= +cloud.google.com/go/gsuiteaddons v1.6.5/go.mod h1:Lo4P2IvO8uZ9W+RaC6s1JVxo42vgy+TX5a6hfBZ0ubs= cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= @@ -312,20 +681,44 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= +cloud.google.com/go/iam v1.1.4/go.mod h1:l/rg8l1AaA+VFMho/HYx2Vv6xinPSLMF8qfhRPIZ0L8= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/iam v1.1.13 h1:7zWBXG9ERbMLrzQBRhFliAV+kjcRToDTgQT3CTwYyv4= +cloud.google.com/go/iam v1.1.13/go.mod h1:K8mY0uSXwEXS30KrnVb+j54LB/ntfZu1dr+4zFMNbus= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/iap v1.9.0/go.mod h1:01OFxd1R+NFrg78S+hoPV5PxEzv22HXaNqUUlmNHFuY= +cloud.google.com/go/iap v1.9.1/go.mod h1:SIAkY7cGMLohLSdBR25BuIxO+I4fXJiL06IBL7cy/5Q= +cloud.google.com/go/iap v1.9.2/go.mod h1:GwDTOs047PPSnwRD0Us5FKf4WDRcVvHg1q9WVkKBhdI= +cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= +cloud.google.com/go/iap v1.9.4/go.mod h1:vO4mSq0xNf/Pu6E5paORLASBwEmphXEjgCFg7aeNu1w= cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/ids v1.4.2/go.mod h1:3vw8DX6YddRu9BncxuzMyWn0g8+ooUjI2gslJ7FH3vk= +cloud.google.com/go/ids v1.4.3/go.mod h1:9CXPqI3GedjmkjbMWCUhMZ2P2N7TUMzAkVXYEH2orYU= +cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= +cloud.google.com/go/ids v1.4.5/go.mod h1:p0ZnyzjMWxww6d2DvMGnFwCsSxDJM666Iir1bK1UuBo= cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/iot v1.7.2/go.mod h1:q+0P5zr1wRFpw7/MOgDXrG/HVA+l+cSwdObffkrpnSg= +cloud.google.com/go/iot v1.7.3/go.mod h1:t8itFchkol4VgNbHnIq9lXoOOtHNR3uAACQMYbN9N4I= +cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= +cloud.google.com/go/iot v1.7.5/go.mod h1:nq3/sqTz3HGaWJi1xNiX7F41ThOzpud67vwk0YsSsqs= cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= @@ -333,93 +726,234 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4 cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.2/go.mod h1:3hopT4+7ooWRCjc2DxgnpESFxhIraaI2IpAVUEhbT/w= +cloud.google.com/go/kms v1.15.3/go.mod h1:AJdXqHxS2GlPyduM99s9iGqi2nwbviBbhV/hdmt4iOQ= +cloud.google.com/go/kms v1.15.4/go.mod h1:L3Sdj6QTHK8dfwK5D1JLsAyELsNMnd3tAIwGS4ltKpc= +cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= +cloud.google.com/go/kms v1.15.6/go.mod h1:yF75jttnIdHfGBoE51AKsD/Yqf+/jICzB9v1s1acsms= +cloud.google.com/go/kms v1.15.7/go.mod h1:ub54lbsa6tDkUwnu4W7Yt1aAIFLnspgh0kPGToDukeI= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/language v1.11.0/go.mod h1:uDx+pFDdAKTY8ehpWbiXyQdz8tDSYLJbQcXsCkjYyvQ= +cloud.google.com/go/language v1.11.1/go.mod h1:Xyid9MG9WOX3utvDbpX7j3tXDmmDooMyMDqgUVpH17U= +cloud.google.com/go/language v1.12.1/go.mod h1:zQhalE2QlQIxbKIZt54IASBzmZpN/aDASea5zl1l+J4= +cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= +cloud.google.com/go/language v1.12.3/go.mod h1:evFX9wECX6mksEva8RbRnr/4wi/vKGYnAJrTRXU8+f8= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/lifesciences v0.9.2/go.mod h1:QHEOO4tDzcSAzeJg7s2qwnLM2ji8IRpQl4p6m5Z9yTA= +cloud.google.com/go/lifesciences v0.9.3/go.mod h1:gNGBOJV80IWZdkd+xz4GQj4mbqaz737SCLHn2aRhQKM= +cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= +cloud.google.com/go/lifesciences v0.9.5/go.mod h1:OdBm0n7C0Osh5yZB7j9BXyrMnTRGBJIZonUMxo5CzPw= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= +cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= +cloud.google.com/go/longrunning v0.5.3/go.mod h1:y/0ga59EYu58J6SHmmQOvekvND2qODbu8ywBBW7EK7Y= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= +cloud.google.com/go/longrunning v0.5.12 h1:5LqSIdERr71CqfUsFlJdBpOkBH8FBCFD7P1nTWy3TYE= +cloud.google.com/go/longrunning v0.5.12/go.mod h1:S5hMV8CDJ6r50t2ubVJSKQVv5u0rmik5//KgLO3k4lU= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/managedidentities v1.6.2/go.mod h1:5c2VG66eCa0WIq6IylRk3TBW83l161zkFvCj28X7jn8= +cloud.google.com/go/managedidentities v1.6.3/go.mod h1:tewiat9WLyFN0Fi7q1fDD5+0N4VUoL0SCX0OTCthZq4= +cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= +cloud.google.com/go/managedidentities v1.6.5/go.mod h1:fkFI2PwwyRQbjLxlm5bQ8SjtObFMW3ChBGNqaMcgZjI= cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.1/go.mod h1:BxSa0BnW1g2U2gNdbq5zikLlHUuHW0GFWh7sgML2kIY= +cloud.google.com/go/maps v1.5.1/go.mod h1:NPMZw1LJwQZYCfz4y+EIw+SI+24A4bpdFJqdKVr0lt4= +cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= +cloud.google.com/go/maps v1.6.2/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= +cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= +cloud.google.com/go/maps v1.6.4/go.mod h1:rhjqRy8NWmDJ53saCfsXQ0LKwBHfi6OSh5wkq6BaMhI= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/mediatranslation v0.8.2/go.mod h1:c9pUaDRLkgHRx3irYE5ZC8tfXGrMYwNZdmDqKMSfFp8= +cloud.google.com/go/mediatranslation v0.8.3/go.mod h1:F9OnXTy336rteOEywtY7FOqCk+J43o2RF638hkOQl4Y= +cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= +cloud.google.com/go/mediatranslation v0.8.5/go.mod h1:y7kTHYIPCIfgyLbKncgqouXJtLsU+26hZhHEEy80fSs= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/memcache v1.10.2/go.mod h1:f9ZzJHLBrmd4BkguIAa/l/Vle6uTHzHokdnzSWOdQ6A= +cloud.google.com/go/memcache v1.10.3/go.mod h1:6z89A41MT2DVAW0P4iIRdu5cmRTsbsFn4cyiIx8gbwo= +cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= +cloud.google.com/go/memcache v1.10.5/go.mod h1:/FcblbNd0FdMsx4natdj+2GWzTq+cjZvMa1I+9QsuMA= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.13.0/go.mod h1:URDhpG6XLeh5K+Glq0NOt74OfrPKTwS62gEPZzb5SOk= +cloud.google.com/go/metastore v1.13.1/go.mod h1:IbF62JLxuZmhItCppcIfzBBfUFq0DIB9HPDoLgWrVOU= +cloud.google.com/go/metastore v1.13.2/go.mod h1:KS59dD+unBji/kFebVp8XU/quNSyo8b6N6tPGspKszA= +cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= +cloud.google.com/go/metastore v1.13.4/go.mod h1:FMv9bvPInEfX9Ac1cVcRXp8EBBQnBcqH6gz3KvJ9BAE= cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.17.1 h1:xqcNr+JXmFMCPXnent/i1r0De6zrcqzgcMy5X1xa5vg= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY= +cloud.google.com/go/monitoring v1.16.1/go.mod h1:6HsxddR+3y9j+o/cMJH6q/KJ/CBTvM/38L/1m7bTRJ4= +cloud.google.com/go/monitoring v1.16.2/go.mod h1:B44KGwi4ZCF8Rk/5n+FWeispDXoKSk9oss2QNlXJBgc= +cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= +cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= cloud.google.com/go/monitoring v1.17.1/go.mod h1:SJzPMakCF0GHOuKEH/r4hxVKF04zl+cRPQyc3d/fqII= +cloud.google.com/go/monitoring v1.18.0/go.mod h1:c92vVBCeq/OB4Ioyo+NbN2U7tlg5ZH41PZcdvfc+Lcg= +cloud.google.com/go/monitoring v1.20.4 h1:zwcViK7mT9SV0kzKqLOI3spRadvsmvw/R9z1MHNeC0E= +cloud.google.com/go/monitoring v1.20.4/go.mod h1:v7F/UcLRw15EX7xq565N7Ae5tnYEE28+Cl717aTXG4c= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkconnectivity v1.13.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= +cloud.google.com/go/networkconnectivity v1.14.0/go.mod h1:SAnGPes88pl7QRLUen2HmcBSE9AowVAcdug8c0RSBFk= +cloud.google.com/go/networkconnectivity v1.14.1/go.mod h1:LyGPXR742uQcDxZ/wv4EI0Vu5N6NKJ77ZYVnDe69Zug= +cloud.google.com/go/networkconnectivity v1.14.2/go.mod h1:5UFlwIisZylSkGG1AdwK/WZUaoz12PKu6wODwIbFzJo= +cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= +cloud.google.com/go/networkconnectivity v1.14.4/go.mod h1:PU12q++/IMnDJAB+3r+tJtuCXCfwfN+C6Niyj6ji1Po= cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networkmanagement v1.9.0/go.mod h1:UTUaEU9YwbCAhhz3jEOHr+2/K/MrBk2XxOLS89LQzFw= +cloud.google.com/go/networkmanagement v1.9.1/go.mod h1:CCSYgrQQvW73EJawO2QamemYcOb57LvrDdDU51F0mcI= +cloud.google.com/go/networkmanagement v1.9.2/go.mod h1:iDGvGzAoYRghhp4j2Cji7sF899GnfGQcQRQwgVOWnDw= +cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= +cloud.google.com/go/networkmanagement v1.9.4/go.mod h1:daWJAl0KTFytFL7ar33I6R/oNBH8eEOX/rBNHrC/8TA= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/networksecurity v0.9.2/go.mod h1:jG0SeAttWzPMUILEHDUvFYdQTl8L/E/KC8iZDj85lEI= +cloud.google.com/go/networksecurity v0.9.3/go.mod h1:l+C0ynM6P+KV9YjOnx+kk5IZqMSLccdBqW6GUoF4p/0= +cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= +cloud.google.com/go/networksecurity v0.9.5/go.mod h1:KNkjH/RsylSGyyZ8wXpue8xpCEK+bTtvof8SBfIhMG8= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/notebooks v1.10.0/go.mod h1:SOPYMZnttHxqot0SGSFSkRrwE29eqnKPBJFqgWmiK2k= +cloud.google.com/go/notebooks v1.10.1/go.mod h1:5PdJc2SgAybE76kFQCWrTfJolCOUQXF97e+gteUUA6A= +cloud.google.com/go/notebooks v1.11.1/go.mod h1:V2Zkv8wX9kDCGRJqYoI+bQAaoVeE5kSiz4yYHd2yJwQ= +cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= +cloud.google.com/go/notebooks v1.11.3/go.mod h1:0wQyI2dQC3AZyQqWnRsp+yA+kY4gC7ZIVP4Qg3AQcgo= cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/optimization v1.5.0/go.mod h1:evo1OvTxeBRBu6ydPlrIRizKY/LJKo/drDMMRKqGEUU= +cloud.google.com/go/optimization v1.5.1/go.mod h1:NC0gnUD5MWVAF7XLdoYVPmYYVth93Q6BUzqAq3ZwtV8= +cloud.google.com/go/optimization v1.6.1/go.mod h1:hH2RYPTTM9e9zOiTaYPTiGPcGdNZVnBSBxjIAJzUkqo= +cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= +cloud.google.com/go/optimization v1.6.3/go.mod h1:8ve3svp3W6NFcAEFr4SfJxrldzhUl4VMUJmhrqVKtYA= cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orchestration v1.8.2/go.mod h1:T1cP+6WyTmh6LSZzeUhvGf0uZVmJyTx7t8z7Vg87+A0= +cloud.google.com/go/orchestration v1.8.3/go.mod h1:xhgWAYqlbYjlz2ftbFghdyqENYW+JXuhBx9KsjMoGHs= +cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= +cloud.google.com/go/orchestration v1.8.5/go.mod h1:C1J7HesE96Ba8/hZ71ISTV2UAat0bwN+pi85ky38Yq8= cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/orgpolicy v1.11.2/go.mod h1:biRDpNwfyytYnmCRWZWxrKF22Nkz9eNVj9zyaBdpm1o= +cloud.google.com/go/orgpolicy v1.11.3/go.mod h1:oKAtJ/gkMjum5icv2aujkP4CxROxPXsBbYGCDbPO8MM= +cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= +cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= +cloud.google.com/go/orgpolicy v1.12.1/go.mod h1:aibX78RDl5pcK3jA8ysDQCFkVxLj3aOQqrbBaUL2V5I= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/osconfig v1.12.2/go.mod h1:eh9GPaMZpI6mEJEuhEjUJmaxvQ3gav+fFEJon1Y8Iw0= +cloud.google.com/go/osconfig v1.12.3/go.mod h1:L/fPS8LL6bEYUi1au832WtMnPeQNT94Zo3FwwV1/xGM= +cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= +cloud.google.com/go/osconfig v1.12.5/go.mod h1:D9QFdxzfjgw3h/+ZaAb5NypM8bhOMqBzgmbhzWViiW8= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/oslogin v1.11.0/go.mod h1:8GMTJs4X2nOAUVJiPGqIWVcDaF0eniEto3xlOxaboXE= +cloud.google.com/go/oslogin v1.11.1/go.mod h1:OhD2icArCVNUxKqtK0mcSmKL7lgr0LVlQz+v9s1ujTg= +cloud.google.com/go/oslogin v1.12.1/go.mod h1:VfwTeFJGbnakxAY236eN8fsnglLiVXndlbcNomY4iZU= +cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= +cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= +cloud.google.com/go/oslogin v1.13.1/go.mod h1:vS8Sr/jR7QvPWpCjNqy6LYZr5Zs1e8ZGW/KPn9gmhws= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/phishingprotection v0.8.2/go.mod h1:LhJ91uyVHEYKSKcMGhOa14zMMWfbEdxG032oT6ECbC8= +cloud.google.com/go/phishingprotection v0.8.3/go.mod h1:3B01yO7T2Ra/TMojifn8EoGd4G9jts/6cIO0DgDY9J8= +cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= +cloud.google.com/go/phishingprotection v0.8.5/go.mod h1:g1smd68F7mF1hgQPuYn3z8HDbNre8L6Z0b7XMYFmX7I= cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/policytroubleshooter v1.9.0/go.mod h1:+E2Lga7TycpeSTj2FsH4oXxTnrbHJGRlKhVZBLGgU64= +cloud.google.com/go/policytroubleshooter v1.9.1/go.mod h1:MYI8i0bCrL8cW+VHN1PoiBTyNZTstCg2WUw2eVC4c4U= +cloud.google.com/go/policytroubleshooter v1.10.1/go.mod h1:5C0rhT3TDZVxAu8813bwmTvd57Phbl8mr9F4ipOsxEs= +cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= +cloud.google.com/go/policytroubleshooter v1.10.3/go.mod h1:+ZqG3agHT7WPb4EBIRqUv4OyIwRTZvsVDHZ8GlZaoxk= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/privatecatalog v0.9.2/go.mod h1:RMA4ATa8IXfzvjrhhK8J6H4wwcztab+oZph3c6WmtFc= +cloud.google.com/go/privatecatalog v0.9.3/go.mod h1:K5pn2GrVmOPjXz3T26mzwXLcKivfIJ9R5N79AFCF9UE= +cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= +cloud.google.com/go/privatecatalog v0.9.5/go.mod h1:fVWeBOVe7uj2n3kWRGlUQqR/pOd450J9yZoOECcQqJk= 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= @@ -428,9 +962,14 @@ cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcd cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= +cloud.google.com/go/pubsub v1.36.1/go.mod h1:iYjCa9EzWOoBiTdd4ps7QoMtMln5NwaZQpK1hbRfBDE= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= @@ -439,46 +978,104 @@ cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.0/go.mod h1:QuE8EdU9dEnesG8/kG3XuJyNsjEqMlMzg3v3scCJ46c= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.1/go.mod h1:JZYZJOeZjgSSTGP4uz7NlQ4/d1w5hGmksVgM0lbEij0= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.2/go.mod h1:kpaDBOpkwD4G0GVMzG1W6Doy1tFFC97XAV3xy+Rd/pw= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.3/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recaptchaenterprise/v2 v2.9.2/go.mod h1:trwwGkfhCmp05Ll5MSJPXY7yvnO0p4v3orGANAFHAuU= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommendationengine v0.8.2/go.mod h1:QIybYHPK58qir9CV2ix/re/M//Ty10OxjnnhWdaKS1Y= +cloud.google.com/go/recommendationengine v0.8.3/go.mod h1:m3b0RZV02BnODE9FeSvGv1qibFo8g0OnmB/RMwYy4V8= +cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= +cloud.google.com/go/recommendationengine v0.8.5/go.mod h1:A38rIXHGFvoPvmy6pZLozr0g59NRNREz4cx7F58HAsQ= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/recommender v1.11.0/go.mod h1:kPiRQhPyTJ9kyXPCG6u/dlPLbYfFlkwHNRwdzPVAoII= +cloud.google.com/go/recommender v1.11.1/go.mod h1:sGwFFAyI57v2Hc5LbIj+lTwXipGu9NW015rkaEM5B18= +cloud.google.com/go/recommender v1.11.2/go.mod h1:AeoJuzOvFR/emIcXdVFkspVXVTYpliRCmKNYDnyBv6Y= +cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= +cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= +cloud.google.com/go/recommender v1.12.1/go.mod h1:gf95SInWNND5aPas3yjwl0I572dtudMhMIG4ni8nr+0= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/redis v1.13.2/go.mod h1:0Hg7pCMXS9uz02q+LoEVl5dNHUkIQv+C/3L76fandSA= +cloud.google.com/go/redis v1.13.3/go.mod h1:vbUpCKUAZSYzFcWKmICnYgRAhTFg9r+djWqFxDYXi4U= +cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= +cloud.google.com/go/redis v1.14.2/go.mod h1:g0Lu7RRRz46ENdFKQ2EcQZBAJ2PtJHJLuiiRuEXwyQw= cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcemanager v1.9.2/go.mod h1:OujkBg1UZg5lX2yIyMo5Vz9O5hf7XQOSV7WxqxxMtQE= +cloud.google.com/go/resourcemanager v1.9.3/go.mod h1:IqrY+g0ZgLsihcfcmqSe+RKp1hzjXwG904B92AwBz6U= +cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= +cloud.google.com/go/resourcemanager v1.9.5/go.mod h1:hep6KjelHA+ToEjOfO3garMKi/CLYwTqeAw7YiEI9x8= cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/resourcesettings v1.6.2/go.mod h1:mJIEDd9MobzunWMeniaMp6tzg4I2GvD3TTmPkc8vBXk= +cloud.google.com/go/resourcesettings v1.6.3/go.mod h1:pno5D+7oDYkMWZ5BpPsb4SO0ewg3IXcmmrUZaMJrFic= +cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= +cloud.google.com/go/resourcesettings v1.6.5/go.mod h1:WBOIWZraXZOGAgoR4ukNj0o0HiSMO62H9RpFi9WjP9I= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/retail v1.14.2/go.mod h1:W7rrNRChAEChX336QF7bnMxbsjugcOCPU44i5kbLiL8= +cloud.google.com/go/retail v1.14.3/go.mod h1:Omz2akDHeSlfCq8ArPKiBxlnRpKEBjUH386JYFLUvXo= +cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= +cloud.google.com/go/retail v1.15.1/go.mod h1:In9nSBOYhLbDGa87QvWlnE1XA14xBN2FpQRiRsUs9wU= +cloud.google.com/go/retail v1.16.0/go.mod h1:LW7tllVveZo4ReWt68VnldZFWJRzsh9np+01J9dYWzE= cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/run v1.3.0/go.mod h1:S/osX/4jIPZGg+ssuqh6GNgg7syixKe3YnprwehzHKU= +cloud.google.com/go/run v1.3.1/go.mod h1:cymddtZOzdwLIAsmS6s+Asl4JoXIDm/K1cpZTxV4Q5s= +cloud.google.com/go/run v1.3.2/go.mod h1:SIhmqArbjdU/D9M6JoHaAqnAMKLFtXaVdNeq04NjnVE= +cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= +cloud.google.com/go/run v1.3.4/go.mod h1:FGieuZvQ3tj1e9GnzXqrMABSuir38AJg5xhiYq+SF3o= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/scheduler v1.10.2/go.mod h1:O3jX6HRH5eKCA3FutMw375XHZJudNIKVonSCHv7ropY= +cloud.google.com/go/scheduler v1.10.3/go.mod h1:8ANskEM33+sIbpJ+R4xRfw/jzOG+ZFE8WVLy7/yGvbc= +cloud.google.com/go/scheduler v1.10.4/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/scheduler v1.10.6/go.mod h1:pe2pNCtJ+R01E06XCDOJs1XvAMbv28ZsQEbqknxGOuE= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/secretmanager v1.11.2/go.mod h1:MQm4t3deoSub7+WNwiC4/tRYgDBHJgJPvswqQVB1Vss= +cloud.google.com/go/secretmanager v1.11.3/go.mod h1:0bA2o6FabmShrEy328i67aV+65XoUFFSmVeLBn/51jI= +cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= +cloud.google.com/go/secretmanager v1.11.5/go.mod h1:eAGv+DaCHkeVyQi0BeXgAHOU0RdrMeZIASKc+S7VqH4= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= @@ -486,12 +1083,23 @@ cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/security v1.15.2/go.mod h1:2GVE/v1oixIRHDaClVbHuPcZwAqFM28mXuAKCfMgYIg= +cloud.google.com/go/security v1.15.3/go.mod h1:gQ/7Q2JYUZZgOzqKtw9McShH+MjNvtDpL40J1cT+vBs= +cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= +cloud.google.com/go/security v1.15.5/go.mod h1:KS6X2eG3ynWjqcIX976fuToN5juVkF6Ra6c7MPnldtc= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/securitycenter v1.23.1/go.mod h1:w2HV3Mv/yKhbXKwOCu2i8bCuLtNP1IMHuiYQn4HJq5s= +cloud.google.com/go/securitycenter v1.24.1/go.mod h1:3h9IdjjHhVMXdQnmqzVnM7b0wMn/1O/U20eWVpMpZjI= +cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/securitycenter v1.24.4/go.mod h1:PSccin+o1EMYKcFQzz9HMMnZ2r9+7jbc+LvPjXhpwcU= cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= @@ -503,6 +1111,12 @@ cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPj cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.1/go.mod h1:tJywXimEWzNzw9FvtNjsQxxJ3/41jseeILgwU/QLrGI= +cloud.google.com/go/servicedirectory v1.11.2/go.mod h1:KD9hCLhncWRV5jJphwIpugKwM5bn1x0GyVVD4NO8mGg= +cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= +cloud.google.com/go/servicedirectory v1.11.4/go.mod h1:Bz2T9t+/Ehg6x+Y7Ycq5xiShYLD96NfEsWNHyitj1qM= cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= @@ -514,15 +1128,37 @@ cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DR cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/shell v1.7.2/go.mod h1:KqRPKwBV0UyLickMn0+BY1qIyE98kKyI216sH/TuHmc= +cloud.google.com/go/shell v1.7.3/go.mod h1:cTTEz/JdaBsQAeTQ3B6HHldZudFoYBOqjteev07FbIc= +cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= +cloud.google.com/go/shell v1.7.5/go.mod h1:hL2++7F47/IfpfTO53KYf1EC+F56k3ThfNEXd4zcuiE= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/spanner v1.49.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= +cloud.google.com/go/spanner v1.50.0/go.mod h1:eGj9mQGK8+hkgSVbHNQ06pQ4oS+cyc4tXXd6Dif1KoM= +cloud.google.com/go/spanner v1.51.0/go.mod h1:c5KNo5LQ1X5tJwma9rSQZsXNBDNvj4/n8BVc3LNahq0= +cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= +cloud.google.com/go/spanner v1.53.1/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= +cloud.google.com/go/spanner v1.54.0/go.mod h1:wZvSQVBgngF0Gq86fKup6KIYmN2be7uOKjtK97X+bQU= +cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= +cloud.google.com/go/spanner v1.56.0/go.mod h1:DndqtUKQAt3VLuV2Le+9Y3WTnq5cNKrnLb/Piqcj+h0= +cloud.google.com/go/spanner v1.57.0/go.mod h1:aXQ5QDdhPRIqVhYmnkAdwPYvj/DRN0FguclhEWw+jOo= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.1/go.mod h1:WcuaWz/3hOlzPFOVo9DUsblMIHwxP589y6ZMtaG+iAA= +cloud.google.com/go/speech v1.19.2/go.mod h1:2OYFfj+Ch5LWjsaSINuCZsre/789zlcCI3SY4oAi2oI= +cloud.google.com/go/speech v1.20.1/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= +cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= +cloud.google.com/go/speech v1.21.1/go.mod h1:E5GHZXYQlkqWQwY5xRSLHw2ci5NMQNG52FfMU1aZrIA= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -534,45 +1170,93 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storage v1.37.0/go.mod h1:i34TiT2IhiNDmcj65PqwCjcoUX7Z5pLzS8DEmoiFq1k= +cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= +cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/storagetransfer v1.10.1/go.mod h1:rS7Sy0BtPviWYTTJVWCSV4QrbBitgPeuK4/FKa4IdLs= +cloud.google.com/go/storagetransfer v1.10.2/go.mod h1:meIhYQup5rg9juQJdyppnA/WLQCOguxtk1pr3/vBWzA= +cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= +cloud.google.com/go/storagetransfer v1.10.4/go.mod h1:vef30rZKu5HSEf/x1tK3WfWrL0XVoUQN/EPDRGPzjZs= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/talent v1.6.3/go.mod h1:xoDO97Qd4AK43rGjJvyBHMskiEf3KulgYzcH6YWOVoo= +cloud.google.com/go/talent v1.6.4/go.mod h1:QsWvi5eKeh6gG2DlBkpMaFYZYrYUnIpo34f6/V5QykY= +cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= +cloud.google.com/go/talent v1.6.6/go.mod h1:y/WQDKrhVz12WagoarpAIyKKMeKGKHWPoReZ0g8tseQ= cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/texttospeech v1.7.2/go.mod h1:VYPT6aTOEl3herQjFHYErTlSZJ4vB00Q2ZTmuVgluD4= +cloud.google.com/go/texttospeech v1.7.3/go.mod h1:Av/zpkcgWfXlDLRYob17lqMstGZ3GqlvJXqKMp2u8so= +cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= +cloud.google.com/go/texttospeech v1.7.5/go.mod h1:tzpCuNWPwrNJnEa4Pu5taALuZL4QRRLcb+K9pbhXT6M= cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/tpu v1.6.2/go.mod h1:NXh3NDwt71TsPZdtGWgAG5ThDfGd32X1mJ2cMaRlVgU= +cloud.google.com/go/tpu v1.6.3/go.mod h1:lxiueqfVMlSToZY1151IaZqp89ELPSrk+3HIQ5HRkbY= +cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= +cloud.google.com/go/tpu v1.6.5/go.mod h1:P9DFOEBIBhuEcZhXi+wPoVy/cji+0ICFi4TtTkMHSSs= cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/trace v1.10.5 h1:0pr4lIKJ5XZFYD9GtxXEWr0KkVeigc3wlGpZco0X1oA= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/trace v1.10.2/go.mod h1:NPXemMi6MToRFcSxRl2uDnu/qAlAQ3oULUphcHGh1vA= +cloud.google.com/go/trace v1.10.3/go.mod h1:Ke1bgfc73RV3wUFml+uQp7EsDw4dGaETLxB7Iq/r4CY= +cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= cloud.google.com/go/trace v1.10.5/go.mod h1:9hjCV1nGBCtXbAE4YK7OqJ8pmPYSxPA0I67JwRd5s3M= +cloud.google.com/go/trace v1.10.12 h1:GoGZv1iAXEa73HgSGNjRl2vKqp5/f2AeKqErRFXA2kg= +cloud.google.com/go/trace v1.10.12/go.mod h1:tYkAIta/gxgbBZ/PIzFxSH5blajgX4D00RpQqCG/GZs= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.9.0/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.9.1/go.mod h1:TWIgDZknq2+JD4iRcojgeDtqGEp154HN/uL6hMvylS8= +cloud.google.com/go/translate v1.9.2/go.mod h1:E3Tc6rUTsQkVrXW6avbUhKJSr7ZE3j7zNmqzXKHqRrY= +cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/translate v1.10.1/go.mod h1:adGZcQNom/3ogU65N9UXHOnnSvjPwA/jKQUMnsYXOyk= cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.20.0/go.mod h1:U3G3FTnsvAGqglq9LxgqzOiBc/Nt8zis8S+850N2DUM= +cloud.google.com/go/video v1.20.1/go.mod h1:3gJS+iDprnj8SY6pe0SwLeC5BUW80NjhwX7INWEuWGU= +cloud.google.com/go/video v1.20.2/go.mod h1:lrixr5JeKNThsgfM9gqtwb6Okuqzfo4VrY2xynaViTA= +cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= +cloud.google.com/go/video v1.20.4/go.mod h1:LyUVjyW+Bwj7dh3UJnUGZfyqjEto9DnrvTe1f/+QrW0= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/videointelligence v1.11.2/go.mod h1:ocfIGYtIVmIcWk1DsSGOoDiXca4vaZQII1C85qtoplc= +cloud.google.com/go/videointelligence v1.11.3/go.mod h1:tf0NUaGTjU1iS2KEkGWvO5hRHeCkFK3nPo0/cOZhZAo= +cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= +cloud.google.com/go/videointelligence v1.11.5/go.mod h1:/PkeQjpRponmOerPeJxNPuxvi12HlW7Em0lJO14FC3I= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= @@ -580,52 +1264,90 @@ cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vision/v2 v2.7.3/go.mod h1:V0IcLCY7W+hpMKXK1JYE0LV5llEqVmj+UJChjvA1WsM= +cloud.google.com/go/vision/v2 v2.7.4/go.mod h1:ynDKnsDN/0RtqkKxQZ2iatv3Dm9O+HfRb5djl7l4Vvw= +cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= +cloud.google.com/go/vision/v2 v2.7.6/go.mod h1:ZkvWTVNPBU3YZYzgF9Y1jwEbD1NBOCyJn0KFdQfE6Bw= +cloud.google.com/go/vision/v2 v2.8.0/go.mod h1:ocqDiA2j97pvgogdyhoxiQp2ZkDCyr0HWpicywGGRhU= cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmmigration v1.7.2/go.mod h1:iA2hVj22sm2LLYXGPT1pB63mXHhrH1m/ruux9TwWLd8= +cloud.google.com/go/vmmigration v1.7.3/go.mod h1:ZCQC7cENwmSWlwyTrZcWivchn78YnFniEQYRWQ65tBo= +cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= +cloud.google.com/go/vmmigration v1.7.5/go.mod h1:pkvO6huVnVWzkFioxSghZxIGcsstDvYiVCxQ9ZH3eYI= cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.1/go.mod h1:aT3Xsm5sNx0QShk1Jc1B8OddrxAScYLwzVoaiXfdzzk= +cloud.google.com/go/vmwareengine v1.0.2/go.mod h1:xMSNjIk8/itYrz1JA8nV3Ajg4L4n3N+ugP8JKzk3OaA= +cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= +cloud.google.com/go/vmwareengine v1.1.1/go.mod h1:nMpdsIVkUrSaX8UvmnBhzVzG7PPvNYc5BszcvIVudYs= cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/vpcaccess v1.7.2/go.mod h1:mmg/MnRHv+3e8FJUjeSibVFvQF1cCy2MsFaFqxeY1HU= +cloud.google.com/go/vpcaccess v1.7.3/go.mod h1:YX4skyfW3NC8vI3Fk+EegJnlYFatA+dXK4o236EUCUc= +cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= +cloud.google.com/go/vpcaccess v1.7.5/go.mod h1:slc5ZRvvjP78c2dnL7m4l4R9GwL3wDLcpIWz6P/ziig= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/webrisk v1.9.2/go.mod h1:pY9kfDgAqxUpDBOrG4w8deLfhvJmejKB0qd/5uQIPBc= +cloud.google.com/go/webrisk v1.9.3/go.mod h1:RUYXe9X/wBDXhVilss7EDLW9ZNa06aowPuinUOPCXH8= +cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= +cloud.google.com/go/webrisk v1.9.5/go.mod h1:aako0Fzep1Q714cPEM5E+mtYX8/jsfegAuS8aivxy3U= cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/websecurityscanner v1.6.2/go.mod h1:7YgjuU5tun7Eg2kpKgGnDuEOXWIrh8x8lWrJT4zfmas= +cloud.google.com/go/websecurityscanner v1.6.3/go.mod h1:x9XANObUFR+83Cya3g/B9M/yoHVqzxPnFtgF8yYGAXw= +cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= +cloud.google.com/go/websecurityscanner v1.6.5/go.mod h1:QR+DWaxAz2pWooylsBF854/Ijvuoa3FCyS1zBa1rAVQ= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +cloud.google.com/go/workflows v1.12.0/go.mod h1:PYhSk2b6DhZ508tj8HXKaBh+OFe+xdl0dHF/tJdzPQM= +cloud.google.com/go/workflows v1.12.1/go.mod h1:5A95OhD/edtOhQd/O741NSfIMezNTbCwLM1P1tBRGHM= +cloud.google.com/go/workflows v1.12.2/go.mod h1:+OmBIgNqYJPVggnMo9nqmizW0qEXHhmnAzK/CnBqsHc= +cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= +cloud.google.com/go/workflows v1.12.4/go.mod h1:yQ7HUqOkdJK4duVtMeBCAOPiN1ZF1E9pAMX51vpwB/w= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0 h1:n1DH8TPV4qqPTje2RcUBYwtrTWlabVp4n46+74X2pn4= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.10.0/go.mod h1:HDcZnuGbiyppErN6lB+idp4CKhjbc8gwjto6OPpyggM= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2 h1:LqbJ/WzJUwBf8UiaSzgX7aMclParm9/5Vgp+TY51uBQ= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.2/go.mod h1:yInRyqWXAuaPrgI7p70+lDDgh3mlBohis29jGMISnmc= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0 h1:MxA59PGoCFb+vCwRQi3PhQEwHj4+r2dhuv9HG+vM7iM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.5.0/go.mod h1:uYt4CfhkJA9o0FN7jfE5minm/i4nUE4MjGUJkzB6Zs8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.0 h1:IfFdxTUDiV58iZqPKgyWiz4X4fCxZeQ1pTQPImLYXpY= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.0/go.mod h1:SUZc9YRRHfx2+FAQKNDGrssXehqLpxmwRv2mC/5ntj4= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Code-Hex/go-generics-cache v1.3.1 h1:i8rLwyhoyhaerr7JpjtYjJZUcCbWOdiYO3fZXLiEC4g= -github.com/Code-Hex/go-generics-cache v1.3.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.8.3 h1:i84ZOPT35YCJROyuf97VP/VEdYhQce/8NTLOWq5tqJw= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v1.8.3/go.mod h1:3+qm+VCJbVmQ9uscVz+8h1rRkJEy9ZNFGgpT1XB9mPg= @@ -634,26 +1356,27 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapp github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/KimMachineGun/automemlimit v0.5.0 h1:BeOe+BbJc8L5chL3OwzVYjVzyvPALdd5wxVVOWuUZmQ= -github.com/KimMachineGun/automemlimit v0.5.0/go.mod h1:di3GCKiu9Y+1fs92erCbUvKzPkNyViN3mA0vti/ykEQ= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8= +github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.6 h1:U68crOE3y3MPttCMQGywZOLrTeF5HHJ3/vDBCJn9/bA= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM= -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/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= +github.com/alecthomas/assert/v2 v2.3.0/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/kingpin v1.3.8-0.20210301060133-17f40c25f497 h1:aDITxVUQ/3KBhpVWX57Vo9ntGTxoRw1F0T6/x/tRzNU= github.com/alecthomas/kingpin v1.3.8-0.20210301060133-17f40c25f497/go.mod h1:b6br6/pDFSfMkBgC96TbpOji05q5pa+v5rIlS0Y6XtI= +github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= +github.com/alecthomas/participle/v2 v2.0.0/go.mod h1:rAKZdJldHu8084ojcWevWAL8KmEU+AT+Olodb+WoN2Y= +github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -662,8 +1385,8 @@ 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-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis/v2 v2.22.0 h1:lIHHiSkEyS1MkKHCHzN+0mWrA4YdbGdimE5iZ2sHSzo= @@ -671,29 +1394,26 @@ github.com/alicebob/miniredis/v2 v2.22.0/go.mod h1:XNqvJdQJv5mSuVMc0ynneafpnL/zv github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible h1:9gWa46nstkJ9miBReJcN8Gq34cBFbzSpQZVVT9N09TM= github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -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/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= +github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= 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-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/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.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.50.32 h1:POt81DvegnpQKM4DMDLlHz1CO6OBnEoQ1gRhYFd7QRY= -github.com/aws/aws-sdk-go v1.50.32/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.16.0 h1:cBAYjiiexRAg9v2z9vb6IdxAa7ef4KCtjW7w7e3GxGo= github.com/aws/aws-sdk-go-v2 v1.16.0/go.mod h1:lJYcuZZEHWNIb6ugJjbQY1fykdoobWbOS7kJYb4APoI= github.com/aws/aws-sdk-go-v2/config v1.15.1 h1:hTIZFepYESYyowQUBo47lu69WSxsYqGUILY9Nu8+7pY= @@ -726,15 +1446,16 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 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/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw= +github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/caio/go-tdigest v3.1.0+incompatible h1:uoVMJ3Q5lXmVLCCqaMGHLBWnbGoN6Lpu7OAUPR60cds= +github.com/caio/go-tdigest v3.1.0+incompatible/go.mod h1:sHQM/ubZStBUmF1WbB8FAm8q9GjDajLC5T7ydxE3JHI= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= @@ -742,8 +1463,9 @@ 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/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89 h1:aPflPkRFkVwbW6dmcVqfgwp1i+UWGFH6VgR1Jim5Ygc= github.com/chromedp/cdproto v0.0.0-20230802225258-3cf4e6d46a89/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= @@ -751,13 +1473,18 @@ github.com/chromedp/chromedp v0.9.2/go.mod h1:LkSXJKONWTCHAfQasKFUZI+mxqS4tZqhmt github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= 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/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= 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/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y= github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs= github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= @@ -765,62 +1492,56 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230428030218-4003588d1b74/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= +github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b h1:ga8SEFjZ60pxLcmhnThWgvH2wg8376yUJmPhEH4H3kw= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cortexproject/promqlsmith v0.0.0-20240326071418-c2a9ca1e89f5 h1:UfuB6no2X1BcKxICY63lzgY+XaPMQ/Wv4woP3p0L+mg= -github.com/cortexproject/promqlsmith v0.0.0-20240326071418-c2a9ca1e89f5/go.mod h1:fcysbw4fOsOipXKeXPXWSh7tXrUQSUr5V4duojv0oCM= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cortexproject/promqlsmith v0.0.0-20240506042652-6cfdd9739a5e h1:nOWmgQD3L/Z0bmm29iDxB7nlqjMnh7yD/PNOx9rnZmA= +github.com/cortexproject/promqlsmith v0.0.0-20240506042652-6cfdd9739a5e/go.mod h1:+bSqRETXJ1uk2S93m//htzTVqu8DJPvlGEb3bSE9PzI= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cucumber/godog v0.8.1 h1:lVb+X41I4YDreE+ibZ50bdXmySxgRviYFgKY6Aw4XE8= -github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= +github.com/cristalhq/hedgedhttp v0.9.1 h1:g68L9cf8uUyQKQJwciD0A1Vgbsz+QgCjuB1I8FAsCDs= +github.com/cristalhq/hedgedhttp v0.9.1/go.mod h1:XkqWU6qVMutbhW68NnzjWrGtH8NUx1UfYqGYtHVKIsI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/digitalocean/godo v1.109.0 h1:4W97RJLJSUQ3veRZDNbp1Ol3Rbn6Lmt9bKGvfqYI5SU= -github.com/digitalocean/godo v1.109.0/go.mod h1:R6EmmWI8CT1+fCtjWY9UCB+L5uufuZH13wk3YhxycCs= +github.com/dgryski/go-metro v0.0.0-20200812162917-85c65e2d0165 h1:BS21ZUJ/B5X2UVUbczfmdWH7GapPWAhxcMsDnjJTU1E= +github.com/dgryski/go-metro v0.0.0-20200812162917-85c65e2d0165/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw= +github.com/digitalocean/godo v1.122.0 h1:ziytLQi8QKtDp2K1A+YrYl2dWLHLh2uaMzWvcz9HkKg= +github.com/digitalocean/godo v1.122.0/go.mod h1:WQVH83OHUy6gC4gXpEVQKtxTd4L5oCp+5OialidkPLY= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -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/docker v25.0.3+incompatible h1:D5fy/lYmY7bvZa0XTZ5/UJPljor41F+vdyJG5luQLfQ= -github.com/docker/docker v25.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.2.0+incompatible h1:Rk9nIVdfH3+Vz4cyI/uhbINhEZ/oLmc+CBXmH6fbNk4= +github.com/docker/docker v27.2.0+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-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= 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/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -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= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= 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/efficientgo/core v1.0.0-rc.2 h1:7j62qHLnrZqO3V3UA0AqOGd5d5aXV3AX6m/NZBHp78I= -github.com/efficientgo/core v1.0.0-rc.2/go.mod h1:FfGdkzWarkuzOlY04VY+bGfb1lWrjaL6x/GLcQ4vJps= +github.com/efficientgo/core v1.0.0-rc.3 h1:X6CdgycYWDcbYiJr1H1+lQGzx13o7bq3EUkbB9DsSPc= +github.com/efficientgo/core v1.0.0-rc.3/go.mod h1:FfGdkzWarkuzOlY04VY+bGfb1lWrjaL6x/GLcQ4vJps= github.com/efficientgo/e2e v0.14.1-0.20230710114240-c316eb95ae5b h1:8VX23BNufsa4KCqnnEonvI3yrou2Pjp8JLcbdVn0Fs8= github.com/efficientgo/e2e v0.14.1-0.20230710114240-c316eb95ae5b/go.mod h1:plsKU0YHE9uX+7utvr7SiDtVBSHJyEfHRO4UnUgDmts= github.com/efficientgo/tools/extkingpin v0.0.0-20220817170617-6c25e3b627dd h1:VaYzzXeUbC5fVheskcKVNOyJMEYD+HgrJNzIAg/mRIM= github.com/efficientgo/tools/extkingpin v0.0.0-20220817170617-6c25e3b627dd/go.mod h1:ZV0utlglOczUWv3ih2AbqPSoLoFzdplUYxwV62eZi6Q= +github.com/elastic/go-licenser v0.3.1 h1:RmRukU/JUmts+rpexAw0Fvt2ly7VVu6mw8z4HrEzObU= +github.com/elastic/go-licenser v0.3.1/go.mod h1:D8eNQk70FOCVBl3smCGQt/lv7meBeQno2eI1S5apiHQ= github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= github.com/elastic/go-sysinfo v1.8.1 h1:4Yhj+HdV6WjbCRgGdZpPJ8lZQlXZLKDAeIkmQ/VRvi4= github.com/elastic/go-sysinfo v1.8.1/go.mod h1:JfllUnzoQV/JRYymbH3dO1yggI3mV2oTKSXsDHM+uIM= @@ -831,24 +1552,33 @@ github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxER github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= -github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= +github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/felixge/fgprof v0.9.2 h1:tAMHtWMyl6E0BimjVbFt7fieU6FpjttsZN7j0wT5blc= -github.com/felixge/fgprof v0.9.2/go.mod h1:+VNi+ZXtHIQ6wIw6bUT8nXQRefQflWECoFyRealT5sg= +github.com/felixge/fgprof v0.9.5 h1:8+vR6yu2vvSKn08urWyEuxx75NWPEvybbkBirEpsbVY= +github.com/felixge/fgprof v0.9.5/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -856,15 +1586,17 @@ github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/ github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -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.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 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/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fullstorydev/emulators/storage v0.0.0-20240401123056-edc69752f474 h1:TufioMBjkJ6/Oqmlye/ReuxHFS35HyLmypj/BNy/8GY= +github.com/fullstorydev/emulators/storage v0.0.0-20240401123056-edc69752f474/go.mod h1:PQwxF4UU8wuL+srGxr3BOhIW5zXqgucwVlO/nPZLsxw= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= @@ -874,11 +1606,10 @@ github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmn 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.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/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/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= -github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 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= @@ -892,8 +1623,11 @@ github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KE github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 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-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= @@ -901,8 +1635,8 @@ github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= -github.com/go-openapi/errors v0.21.1 h1:rVisxQPdETctjlYntm0Ek4dKf68nAQocCloCT50vWuI= -github.com/go-openapi/errors v0.21.1/go.mod h1:LyiY9bgc7AVVh6wtVvMYEyoj3KJYNoRw92mmvnMWgj8= +github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= @@ -913,21 +1647,25 @@ github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqv github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU= github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= -github.com/go-openapi/strfmt v0.22.2 h1:DPYOrm6gexCfZZfXUaXFS4+Jw6HAaIIG0SZ5630f8yw= -github.com/go-openapi/strfmt v0.22.2/go.mod h1:HB/b7TCm91rno75Dembc1dFW/0FPLk5CEXsoF9ReNc4= +github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE= github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE= github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-resty/resty/v2 v2.11.0 h1:i7jMfNOJYMp69lq7qozJP+bjgzfAzeOhuGlyDrqxT/8= -github.com/go-resty/resty/v2 v2.11.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= @@ -937,6 +1675,11 @@ github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= +github.com/goccy/go-yaml v1.11.0/go.mod h1:H+mJrWtjPTJAHvRbV09MCK9xYwODM+wRTVFFTWckfng= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= @@ -946,8 +1689,6 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= 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.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= @@ -955,13 +1696,13 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRsugc= github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= -github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw= -github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= 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= @@ -995,13 +1736,15 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -1021,6 +1764,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-pkcs11 v0.2.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= 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= @@ -1032,8 +1777,9 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -1049,16 +1795,23 @@ 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-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= -github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA= +github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= @@ -1066,8 +1819,11 @@ github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp/LBrV2CJKFLWEww= github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -1081,104 +1837,82 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= -github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3 h1:eHv/jVY/JNop1xg2J9cBb4EzyMpWZoNCP1BslSAIkOI= github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3/go.mod h1:h/KNeRx7oYU4SpA4SoY7W2/NxDKEEVuwA6j9A27L4OI= -github.com/gophercloud/gophercloud v1.8.0 h1:TM3Jawprb2NrdOnvcHhWJalmKmAmOGgfZElM/3oBYCk= -github.com/gophercloud/gophercloud v1.8.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -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= +github.com/gophercloud/gophercloud v1.14.0 h1:Bt9zQDhPrbd4qX7EILGmy+i7GP35cc+AAL2+wIJpUE8= +github.com/gophercloud/gophercloud v1.14.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= 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.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= -github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -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/providers/kit/v2 v2.0.0-20201002093600-73cf2ae9d891 h1:RhOqTAECcPnehv3hKlYy1fAnpQ7rnZu58l3mpq6gT1k= -github.com/grpc-ecosystem/go-grpc-middleware/providers/kit/v2 v2.0.0-20201002093600-73cf2ae9d891/go.mod h1:516cTXxZzi4NBUBbKcwmO4Eqbb6GHAEd3o4N+GYyCBY= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-20200501113911-9a95f0fdbfea/go.mod h1:GugMBs30ZSAkckqXEAIEGyYdDH6EgqowG8ppA3Zt+AY= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.2.0.20201207153454-9f6bf00c00a7 h1:guQyUpELu4I0wKgdsRBZDA5blfGiUleuppRSVy9Qbi0= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.2.0.20201207153454-9f6bf00c00a7/go.mod h1:GhphxcdlaRyAuBSvo6rV71BvQcvB/vuX8ugCyybuS2k= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= 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.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.28.2 h1:mXfkRHrpHN4YY3RqL09nXU1eHKLNiuAN4kHvDQ16k/8= -github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/api v1.29.4 h1:P6slzxDLBOxUSj3fWo2o65VuKtbtOXFi7TSSgtXutuE= +github.com/hashicorp/consul/api v1.29.4/go.mod h1:HUlfw+l2Zy68ceJavv2zAyArl2fqhGWnMycyt56sBgg= github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= -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.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 v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 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.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= -github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -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/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702 h1:fI1LXuBaS1d9z1kmb++Og6YD8uMRwadXorCwE+xgOFA= -github.com/hashicorp/nomad/api v0.0.0-20240306004928-3e7191ccb702/go.mod h1:z71gkJdrkAt/Rl6C7Q79VE7AwJ5lUF+M+fzFTyIHYB0= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= +github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hetznercloud/hcloud-go/v2 v2.6.0 h1:RJOA2hHZ7rD1pScA4O1NF6qhkHyUdbbxjHgFNot8928= -github.com/hetznercloud/hcloud-go/v2 v2.6.0/go.mod h1:4J1cSE57+g0WS93IiHLV7ubTHItcp+awzeBp5bM9mfA= +github.com/hetznercloud/hcloud-go/v2 v2.13.1 h1:jq0GP4QaYE5d8xR/Zw17s9qoaESRJMXfGmtD1a/qckQ= +github.com/hetznercloud/hcloud-go/v2 v2.13.1/go.mod h1:dhix40Br3fDiBhwaSG/zgaYOFFddpfBm/6R1Zz0IiF0= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.3+incompatible h1:tKTaPHNVwikS3I1rdyf1INNvgJXWSf/+TzqsiGbrgnQ= github.com/huaweicloud/huaweicloud-sdk-go-obs v3.23.3+incompatible/go.mod h1:l7VUhRbTKCzdOacdT4oWCwATKyvZqUOlOqr0Ous3k4s= -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/iancoleman/strcase v0.3.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/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -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/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= -github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/ionos-cloud/sdk-go/v6 v6.2.1 h1:mxxN+frNVmbFrmmFfXnBC3g2USYJrl6mc1LW2iNYbFY= +github.com/ionos-cloud/sdk-go/v6 v6.2.1/go.mod h1:SXrO9OGyWjd2rZhAhEpdYN6VUAODzzqRdqA9BCviQtI= +github.com/jcchavezs/porto v0.1.0 h1:Xmxxn25zQMmgE7/yHYmh19KcItG81hIwfbEEFnd6w/Q= +github.com/jcchavezs/porto v0.1.0/go.mod h1:fESH0gzDHiutHRdX2hv27ojnOVFco37hg1W6E9EZF4A= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= 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= @@ -1187,14 +1921,11 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 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= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -1202,25 +1933,26 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -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/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1242,14 +1974,15 @@ github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353 h1:X/79QL0b4YJVO5+OsPH9rF2u428CIrGL/jLmPsoOQQ4= +github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353/go.mod h1:N0SVk0uhy+E1PZ3C9ctsPRlvOPAFPkCNlcPBDkt0N3U= +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-20210210170715-a8dfcb80d3a7 h1:YjW+hUb8Fh2S58z4av4t/0cBMK/Q0aP48RocCFsC8yI= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20210210170715-a8dfcb80d3a7/go.mod h1:Spd59icnvRxSKuyijbbwe5AemzvcyXAUBgApa7VybMw= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lightstep/lightstep-tracer-go v0.25.0 h1:sGVnz8h3jTQuHKMbUe2949nXm3Sg09N1UcR3VoQNN5E= github.com/lightstep/lightstep-tracer-go v0.25.0/go.mod h1:G1ZAEaqTHFPWpWunnbUn1ADEY/Jvzz7jIOaXwAfD6A8= -github.com/linode/linodego v1.30.0 h1:6HJli+LX7NGu+Sne2G+ux790EkVOWOV/SR4mK3jcs6k= -github.com/linode/linodego v1.30.0/go.mod h1:/46h/XpmWi//oSA92GX2p3FIxb8HbX7grslPPQalR2o= +github.com/linode/linodego v1.40.0 h1:7ESY0PwK94hoggoCtIroT1Xk6b1flrFBNZ6KwqbTqlI= +github.com/linode/linodego v1.40.0/go.mod h1:NsUw4l8QrLdIofRg1NYFBbW5ZERnmbZykVBszPZLORM= github.com/lovoo/gcloud-opentracing v0.3.0 h1:nAeKG70rIsog0TelcEtt6KU0Y1s5qXtsDLnHp0urPLU= github.com/lovoo/gcloud-opentracing v0.3.0/go.mod h1:ZFqk2y38kMDDikZPAK7ynTTGuyt17nSPdS3K5e+ZTBY= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= @@ -1257,51 +1990,56 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2 github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= +github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= +github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= +github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE= github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a h1:0usWxe5SGXKQovz3p+BiQ81Jy845xSMu2CWKuXsXuUM= github.com/metalmatze/signal v0.0.0-20210307161603-1c9aa721a97a/go.mod h1:3OETvrxfELvGsU2RoGGWercfeZ4bCL3+SOwzIWtJH/Q= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= -github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.61 h1:87c+x8J3jxQ5VUGimV9oHdpjsAvy3fhneEBKuoKEVUI= -github.com/minio/minio-go/v7 v7.0.61/go.mod h1:BTu8FcrEw+HidY0zd/0eny43QnVNkXRPXrLXFuQBHXg= +github.com/minio/minio-go/v7 v7.0.80 h1:2mdUHXEykRdY/BigLt3Iuu1otL0JTogT0Nmltg0wujk= +github.com/minio/minio-go/v7 v7.0.80/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1316,25 +2054,16 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m 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= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -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.53 h1:luHjjTNtekIEvHg5KdAFIBaH7bWfNkefwFnpDffSIks= github.com/ncw/swift v1.0.53/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= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= 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/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -1342,14 +2071,13 @@ github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= -github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= -github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/onsi/gomega v1.34.0 h1:eSSPsPNp6ZpsG8X1OVmOTxig+CblTc4AxpPBykhe2Os= +github.com/onsi/gomega v1.34.0/go.mod h1:MIKI8c+f+QLWk+hxbePD4i0LMJSExPaZOVfkoex4cAo= 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.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= @@ -1359,38 +2087,30 @@ github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/ github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= -github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/basictracer-go v1.1.0 h1:Oa1fTSBvAl8pa3U+IJYqrKm0NALwH9OsgwOqDv4xJW0= +github.com/opentracing/basictracer-go v1.1.0/go.mod h1:V2HZueSJEp879yv285Aap1BS69fQMD+MNP1mRs6mBQc= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/oracle/oci-go-sdk/v65 v65.41.1 h1:+lbosOyNiib3TGJDvLq1HwEAuFqkOjPJDIkyxM15WdQ= github.com/oracle/oci-go-sdk/v65 v65.41.1/go.mod h1:MXMLMzHnnd9wlpgadPkdlkZ9YrwQmCOmbX5kjVEJodw= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= -github.com/ovh/go-ovh v1.4.3 h1:Gs3V823zwTFpzgGLZNI6ILS4rmxZgJwJCz54Er9LwD0= -github.com/ovh/go-ovh v1.4.3/go.mod h1:AkPXVtgwB6xlKblMjRKJJmjRp+ogrE7fz2lVgcQY8SY= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= +github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= +github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -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/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -1398,13 +2118,13 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= @@ -1414,101 +2134,88 @@ github.com/prometheus-community/prom-label-proxy v0.8.1-0.20240127162815-c1195f9 github.com/prometheus/alertmanager v0.27.0 h1:V6nTa2J5V4s8TG4C4HtrBP/WNSebCCTYGGv4qecA/+I= github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= 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 v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= 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/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= 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= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= -github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -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.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.49.1-0.20240306132007-4199f18c3e92 h1:nuwTDY/15McImfuXcUD6AA3alpUNEXfWws8K/8SXr68= -github.com/prometheus/common v0.49.1-0.20240306132007-4199f18c3e92/go.mod h1:Kxm+EULxRbUkjGU6WFsQqo3ORzB4tyKvlWFOE9mB2sE= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA= +github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= 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.8.2/go.mod h1:00shzmJL7KxcsabLWcONwpyNEuWhREOnFqZW7vadFS0= -github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= -github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= +github.com/prometheus/exporter-toolkit v0.12.0 h1:DkE5RcEZR3lQA2QD5JLVQIf41dFKNsVMXFhgqcif7fo= +github.com/prometheus/exporter-toolkit v0.12.0/go.mod h1:fQH0KtTn0yrrS0S82kqppRjDDiwMfIQUwT+RBRRhwUc= 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-20190425082905-87a4384529e0/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.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/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/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/prometheus v0.51.1-0.20240325140356-78c0fd2f4d75 h1:kIGJHrZqxmiSIidDXlmHISDNtr4dSTqIC6vjxbYsH1I= -github.com/prometheus/prometheus v0.51.1-0.20240325140356-78c0fd2f4d75/go.mod h1:FguQG8pCICrSpHA2pwizwV5FxGNTUBSZED/wMoZwVfY= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/rueidis v1.0.14-go1.18 h1:dGir5z8w8X1ex7JWO/Zx2FMBrZgQ8Yjm+lw9fPLSNGw= -github.com/redis/rueidis v1.0.14-go1.18/go.mod h1:HGekzV3HbmzFmRK6j0xic8Z9119+ECoGMjeN1TV1NYU= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.55.1-0.20241102120812-a6fd22b9d2c8 h1:hCxAh6+hxwy7dqUPE5ndnilMeCWrqQkJVjPDXtiYRVo= +github.com/prometheus/prometheus v0.55.1-0.20241102120812-a6fd22b9d2c8/go.mod h1:GGS7QlWKCqCbcEzWsVahYIfQwiGhcExkarHyLJTsv6I= +github.com/redis/rueidis v1.0.45-alpha.1 h1:69Bu1l7gVC/qDYuGGwMwGg2rjOjSyxESol/Zila62gY= +github.com/redis/rueidis v1.0.45-alpha.1/go.mod h1:q7BfhDaPt7xxwy2nv2RqQO12/mmHflDjebpcNwWFjms= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -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= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/santhosh-tekuri/jsonschema v1.2.4 h1:hNhW8e7t+H1vgY+1QeEQpveR6D4+OwKPXCfD2aieJis= github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25 h1:/8rfZAdFfafRXOgz+ZpMZZWZ5pYggCY9t7e/BvjaBHM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.25/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sercand/kuberesolver/v4 v4.0.0 h1:frL7laPDG/lFm5n98ODmWnn+cvPpzlkf3LhzuPhcHP4= -github.com/sercand/kuberesolver/v4 v4.0.0/go.mod h1:F4RGyuRmMAjeXHKL+w4P7AwUnPceEAPAhxUgXZjKgvM= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30 h1:yoKAVkEVwAqbGbR8n87rHQ1dulL25rKloGadb3vm770= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30/go.mod h1:sH0u6fq6x4R5M7WxkoQFY/o7UaiItec0o1LinLCJNq8= +github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 h1:emzAzMZ1L9iaKCTxdy3Em8Wv4ChIAGnfiz18Cda70g4= +github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg= +github.com/sercand/kuberesolver/v5 v5.1.1 h1:CYH+d67G0sGBj7q5wLK61yzqJJ8gLLC8aeprPTHb6yY= +github.com/sercand/kuberesolver/v5 v5.1.1/go.mod h1:Fs1KbKhVRnB2aDWN12NjKCB+RgYMWZJ294T3BtmVCpQ= github.com/shirou/gopsutil/v3 v3.21.2/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= github.com/shirou/gopsutil/v3 v3.22.9 h1:yibtJhIVEMcdw+tCTbOPiF1VcsuDeTE4utJ8Dm4c5eA= github.com/shirou/gopsutil/v3 v3.22.9/go.mod h1:bBYl1kjgEJpWpxeHmLI+dVHWtyAwfcmSBLDsp2TNT8A= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -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.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -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/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1517,13 +2224,10 @@ github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2 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/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= 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/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/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= 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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1539,43 +2243,47 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.194/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/kms v1.0.194/go.mod h1:yrBKWhChnDqNz1xuXdSbWXG56XawEq0G5j1lg4VwBD4= github.com/tencentyun/cos-go-sdk-v5 v0.7.40 h1:W6vDGKCHe4wBACI1d2UgE6+50sJFhRWU4O8IB2ozzxM= github.com/tencentyun/cos-go-sdk-v5 v0.7.40/go.mod h1:4dCEtLHGh8QPxHEkgq+nFaky7yZxQuYwgSJM87icDaw= github.com/thanos-community/galaxycache v0.0.0-20211122094458-3a32041a1f1e h1:f1Zsv7OAU9iQhZwigp50Yl38W10g/vd5NC8Rdk1Jzng= github.com/thanos-community/galaxycache v0.0.0-20211122094458-3a32041a1f1e/go.mod h1:jXcofnrSln/cLI6/dhlBxPQZEEQHVPCcFaH75M+nSzM= -github.com/thanos-io/objstore v0.0.0-20240309075357-e8336a5fd5f3 h1:Q0BjHI7FMe5KkKVXBFYto5VNASxiA/+AEhHup/IT7N0= -github.com/thanos-io/objstore v0.0.0-20240309075357-e8336a5fd5f3/go.mod h1:ptMYNPgbyAR7a2Ab2t7zHA2/0be2ePyawVR7lp7fZtg= -github.com/thanos-io/promql-engine v0.0.0-20240405095051-b7d0da367508 h1:4X0ThYb7/wTTKS73wT13ixw0lj5OJ87g45RWIZhPZDA= -github.com/thanos-io/promql-engine v0.0.0-20240405095051-b7d0da367508/go.mod h1:FEPnabuTql1bDA4OUM41mwcZOJ20R436k8vq+xtGEG0= +github.com/thanos-io/objstore v0.0.0-20241111205755-d1dd89d41f97 h1:VjG0mwhN1DkncwDHFvrpd12/2TLfgYNRmEQA48ikp+0= +github.com/thanos-io/objstore v0.0.0-20241111205755-d1dd89d41f97/go.mod h1:vyzFrBXgP+fGNG2FopEGWOO/zrIuoy7zt3LpLeezRsw= +github.com/thanos-io/promql-engine v0.0.0-20241203103240-2f49f80c7c68 h1:cChM/FbpXeYmrSmXO1/MmmSlONviLVxWAWCB0/g4JrY= +github.com/thanos-io/promql-engine v0.0.0-20241203103240-2f49f80c7c68/go.mod h1:wx0JlRZtsB2S10JYUgeg5GqLfMxw31SzArP+28yyE00= github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab h1:7ZR3hmisBWw77ZpO1/o86g+JV3VKlk3d48jopJxzTjU= github.com/themihai/gomemcache v0.0.0-20180902122335-24332e2d58ab/go.mod h1:eheTFp954zcWZXCU8d0AT76ftsQOTo4DTqkN/h3k1MY= +github.com/tinylib/msgp v1.1.5 h1:2gXmtWueD2HefZHQe1QOy9HVzmFrLOVvsXwXBQ0ayy0= +github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -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.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/weaveworks/common v0.0.0-20230728070032-dd9e68f319d5 h1:nORobjToZAvi54wcuUXLq+XG2Rsr0XEizy5aHBHvqWQ= github.com/weaveworks/common v0.0.0-20230728070032-dd9e68f319d5/go.mod h1:rgbeLfJUtEr+G74cwFPR1k/4N0kDeaeSv/qhUNE4hm8= github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1591,20 +2299,17 @@ github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zhangyunhao116/umap v0.0.0-20221211160557-cb7705fafa39 h1:D3ltj0b2c2FgUacKrB1pWGgwrUyCESY9W8XYYQ5sqY8= github.com/zhangyunhao116/umap v0.0.0-20221211160557-cb7705fafa39/go.mod h1:r86X1CnsDRrOeLtJlqRWdELPWpkcf933GTlojQlifQw= -go.elastic.co/apm v1.11.0 h1:uJyt6nCW9880sZhfl1tB//Jy/5TadNoAd8edRUtgb3w= -go.elastic.co/apm v1.11.0/go.mod h1:qoOSi09pnzJDh5fKnfY7bPmQgl8yl2tULdOu03xhui0= -go.elastic.co/apm/module/apmhttp v1.11.0 h1:k/MjK0y2aLOXumoM8jcWXqxvIFlMS4U8Bn9cMUPdVX0= -go.elastic.co/apm/module/apmhttp v1.11.0/go.mod h1:5JFMIxdeS4vJy+D1PPPjINuX6hZ3AHalZXoOgyqZAkk= -go.elastic.co/apm/module/apmot v1.11.0 h1:Qmol6ztDJgvGK/B2cRdcPRNw4qE7kRv1d0vo9ptZfIo= -go.elastic.co/apm/module/apmot v1.11.0/go.mod h1:Qnbt3w1DvUd/5QugAF1AJ3mR4AG86EcJFBnAGW77EmU= +go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= +go.elastic.co/apm v1.15.0 h1:uPk2g/whK7c7XiZyz/YCUnAUBNPiyNeE3ARX3G6Gx7Q= +go.elastic.co/apm v1.15.0/go.mod h1:dylGv2HKR0tiCV+wliJz1KHtDyuD8SPe69oV7VyK6WY= +go.elastic.co/apm/module/apmhttp v1.15.0 h1:Le/DhI0Cqpr9wG/NIGOkbz7+rOMqJrfE4MRG6q/+leU= +go.elastic.co/apm/module/apmhttp v1.15.0/go.mod h1:NruY6Jq8ALLzWUVUQ7t4wIzn+onKoiP5woJJdTV7GMg= +go.elastic.co/apm/module/apmot v1.15.0 h1:yqarZ4HCIb6dLAzEVSWdppAuRhfrCfm2Z6UL+ubai2A= +go.elastic.co/apm/module/apmot v1.15.0/go.mod h1:BjFz2KOlnjXdnSo0p6nhDDaIEYYX8c6uVHwvkZiLqtQ= go.elastic.co/fastjson v1.1.0 h1:3MrGBWWVIxe/xvsbpghtkFoPciPhOCmjsR/HfwEeQR4= go.elastic.co/fastjson v1.1.0/go.mod h1:boNGISWMjQsUPy/t6yqt2/1Wx4YNPSe+mZjlyw9vKKI= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -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= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1614,53 +2319,65 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector/featuregate v1.3.0 h1:nrFSx+zfjdisjE9oCx25Aep3nJ9RaUjeE1qFL6eovoU= -go.opentelemetry.io/collector/featuregate v1.3.0/go.mod h1:mm8+xyQfgDmqhyegZRNIQmoKsNnDTwWKFLsdMoXAb7A= -go.opentelemetry.io/collector/pdata v1.3.0 h1:JRYN7tVHYFwmtQhIYbxWeiKSa2L1nCohyAs8sYqKFZo= -go.opentelemetry.io/collector/pdata v1.3.0/go.mod h1:t7W0Undtes53HODPdSujPLTnfSR5fzT+WpL+RTaaayo= -go.opentelemetry.io/collector/semconv v0.96.0 h1:DrZy8BpzJDnN2zFxXRj6BhfGYxNlqpFHBqyuS9fVHRY= -go.opentelemetry.io/collector/semconv v0.96.0/go.mod h1:zOm/U3pgMIWcvrcnPbR9Xx2HinoXj46ERMK8PUV9wrs= +go.opentelemetry.io/collector/pdata v1.14.1 h1:wXZjtQA7Vy5HFqco+yA95ENyMQU5heBB1IxMHQf6mUk= +go.opentelemetry.io/collector/pdata v1.14.1/go.mod h1:z1dTjwwtcoXxZx2/nkHysjxMeaxe9pEmYTEr4SMNIx8= +go.opentelemetry.io/collector/semconv v0.108.1 h1:Txk9tauUnamZaxS5vlf1O0uZ4VD6nioRBR0nX8L/fU4= +go.opentelemetry.io/collector/semconv v0.108.1/go.mod h1:zCJ5njhWpejR+A40kiEoeFm1xq1uzyZwMnRNX6/D82A= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= -go.opentelemetry.io/contrib/propagators/autoprop v0.38.0 h1:WZwiLCwOL0XW/6TVT7LTtdRDveoHZ6q3wL+0iYsBcdE= -go.opentelemetry.io/contrib/propagators/autoprop v0.38.0/go.mod h1:JBebP2d0HiffbfelbIEoBOCl4790g7Z8lD1scUd3Vd8= -go.opentelemetry.io/contrib/propagators/aws v1.13.0 h1:9qOAQhTeJGiaYNfCCnRmL12XZGIaxclqS5yfkSXpn8o= -go.opentelemetry.io/contrib/propagators/aws v1.13.0/go.mod h1:XXahyNfhmY382jrQPE1sKXxTgfnXbx3KzNOweRJV8+A= -go.opentelemetry.io/contrib/propagators/b3 v1.13.0 h1:f17PBmZK60RoHvOpJVqEka8oS2EXjpjHquESD/8zZ50= -go.opentelemetry.io/contrib/propagators/b3 v1.13.0/go.mod h1:zy2hz1TpGUoJzSwlBchVGvVAFQS8s2pglKLbrAFZ+Sc= -go.opentelemetry.io/contrib/propagators/jaeger v1.13.0 h1:+tVlvpiQMOCzi4EYCaBjblibpyKfqoph0fcITmtXMws= -go.opentelemetry.io/contrib/propagators/jaeger v1.13.0/go.mod h1:Qf7eVCLYawiNIB+A81kk8aFDFwYqXSqmt0N2RcvkLLI= -go.opentelemetry.io/contrib/propagators/ot v1.13.0 h1:tHWNd0WRS6w9keZoZg9aF3zYohdaBacQfojPYZJgATQ= -go.opentelemetry.io/contrib/propagators/ot v1.13.0/go.mod h1:R6Op9T6LxNaMRVlGD0wVwz40LSsAq296CXiEydKLQBU= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.7.0 h1:E+RlfFhGZ5Tk0wO1oOJYC0Il4Q7SjE8ZMl8x/VTK9Pk= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.7.0/go.mod h1:cuBMmL+iGJ4UpZi6dykQlIUxqKSMkp5eu1C1UjUJYFI= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= -go.opentelemetry.io/otel/bridge/opentracing v1.21.0 h1:7AfuSFhyvBmt/0YskcdxDyTdHPjQfrHcZQo6Zu5srF4= -go.opentelemetry.io/otel/bridge/opentracing v1.21.0/go.mod h1:giUOMajCV30LvlPHnzRDNBvDV3/NmrGVrqCp/1suDok= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= +go.opentelemetry.io/contrib/propagators/autoprop v0.54.0 h1:h/O1OcNbqrFilsMKfG6MJWWpx8gzCDfn9D+1W7lU3lE= +go.opentelemetry.io/contrib/propagators/autoprop v0.54.0/go.mod h1:VIaPlErTgbng1UhrMA4N6Yy+f94PLA/qRPOCMATdoCs= +go.opentelemetry.io/contrib/propagators/aws v1.29.0 h1:mqadbdNBhn/MVOcNx0dEZAaOaomKKdnsM0QNBmFegiI= +go.opentelemetry.io/contrib/propagators/aws v1.29.0/go.mod h1:3RCUqtGbLbVr6REZv3pQbtqql9GNEpvyB7GiTJhP/nk= +go.opentelemetry.io/contrib/propagators/b3 v1.29.0 h1:hNjyoRsAACnhoOLWupItUjABzeYmX3GTTZLzwJluJlk= +go.opentelemetry.io/contrib/propagators/b3 v1.29.0/go.mod h1:E76MTitU1Niwo5NSN+mVxkyLu4h4h7Dp/yh38F2WuIU= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 h1:+YPiqF5rR6PqHBlmEFLPumbSP0gY0WmCGFayXRcCLvs= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0/go.mod h1:6PD7q7qquWSp3Z4HeM3e/2ipRubaY1rXZO8NIHVDZjs= +go.opentelemetry.io/contrib/propagators/ot v1.29.0 h1:CaJU78FvXrA6ajjp1dOdcABBEjh529+hl396RTqc2LQ= +go.opentelemetry.io/contrib/propagators/ot v1.29.0/go.mod h1:Sc0omwLb4eptUhwOAfYXfmPmErHPu2HV6vkeDge/3sY= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 h1:qKi9ntCcronqWqfuKxqrxZlZd82jXJEgGiAWH1+phxo= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0/go.mod h1:1kbAgQa5lgYC3rC6cE3jSxQ/Q13l33wv/WI8U+htwag= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/bridge/opentracing v1.31.0 h1:S6SA1IQdNHgfZfgkaWBKQqNIlMNiPoyQDACii2uKQ9k= +go.opentelemetry.io/otel/bridge/opentracing v1.31.0/go.mod h1:DnEoPjq3eNCtnB41TqlUQYtarWe8PqJNWRt37daADe4= go.opentelemetry.io/otel/exporters/jaeger v1.16.0 h1:YhxxmXZ011C0aDZKoNw+juVWAmEfv/0W2XBOv9aHTaA= go.opentelemetry.io/otel/exporters/jaeger v1.16.0/go.mod h1:grYbBo/5afWlPpdPZYhyn78Bk04hnvxn2+hvxQhKIQM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 h1:Mw5xcxMwlqoJd97vwPxA8isEaIoxsta9/Q51+TTJLGE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0/go.mod h1:CQNu9bj7o7mC6U7+CA/schKEYakYXWr79ucDHTMGhCM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0 h1:JAv0Jwtl01UFiyWZEMiJZBiTlv5A50zNs8lsthXqIio= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0/go.mod h1:QNKLmUEAq2QUbPQUfvw4fmv0bgbK7UlOSFCnXyfvSNc= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= -go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= @@ -1668,32 +2385,39 @@ go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -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.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -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= go4.org/intern v0.0.0-20230525184215-6c62f75575cb h1:ae7kzL5Cfdmcecbh22ll7lYP3iuUdnfnhiPcSaDgH/8= go4.org/intern v0.0.0-20230525184215-6c62f75575cb/go.mod h1:Ycrt6raEcnF5FTsLiLKkhBTO6DPX3RCUCUVnks3gFJU= go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 h1:WJhcL4p+YeDxmZWg141nRm7XC8IDmhz7lk5GpadO1Sg= go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-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-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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1709,8 +2433,10 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= -golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= +golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1734,6 +2460,7 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -1749,19 +2476,20 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/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-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= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1772,7 +2500,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL 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-20190921015927-1a5e07d1ff72/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= @@ -1781,6 +2508,7 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -1816,6 +2544,7 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= @@ -1823,9 +2552,18 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= 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= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1853,8 +2591,14 @@ golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= +golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= 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= @@ -1871,15 +2615,16 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1891,7 +2636,6 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/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-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1899,7 +2643,6 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/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-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= @@ -1957,7 +2700,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-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-20220406163625-3f8b81556e12/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-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1965,11 +2710,13 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1977,18 +2724,37 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= 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= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2005,18 +2771,21 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 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-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/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-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2025,7 +2794,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -2037,7 +2805,6 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/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-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= @@ -2045,7 +2812,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -2083,11 +2849,17 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= 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= @@ -2096,19 +2868,18 @@ golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= +gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= +gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -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= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -2166,19 +2937,29 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.168.0 h1:MBRe+Ki4mMN93jhDDbpuRLjRddooArz4FeSObvUMmjY= -google.golang.org/api v0.168.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.139.0/go.mod h1:CVagp6Eekz9CjGZ718Z+sloknzkDJE7Vc1Ckj9+viBk= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= +google.golang.org/api v0.157.0/go.mod h1:+z4v4ufbZ1WEpld6yMGHyggs+PmAHiaLNj5ytP3N01g= +google.golang.org/api v0.160.0/go.mod h1:0mu0TpK33qnydLvWqbImq2b1eQ5FHRSDCBzAxX9ZHyw= +google.golang.org/api v0.162.0/go.mod h1:6SulDkfoBIg4NFmCuZ39XeeAgSHCPecfSUuDyYlAHs0= +google.golang.org/api v0.195.0 h1:Ude4N8FvTKnnQJHU48RFI40jOBgIrL8Zqr3/QeST6yU= +google.golang.org/api v0.195.0/go.mod h1:DOGRWuv3P8TU8Lnz7uQc4hyNqrBpMtD9ppW3wBJurgc= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -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= @@ -2311,20 +3092,102 @@ google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVix google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto v0.0.0-20240205150955-31a09d347014 h1:g/4bk7P6TPMkAUbUhquq98xey1slwvuVJPosdBqYJlU= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= +google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= +google.golang.org/genproto v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:EMfReVxb80Dq1hhioy0sOsY9jCE46YDgHlJ7fWVUWRE= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY= +google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= +google.golang.org/genproto v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:+Rvu7ElI+aLzyDQhpHMFMMltsD6m7nqpuWDd2CwJw3k= +google.golang.org/genproto v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= google.golang.org/genproto v0.0.0-20240205150955-31a09d347014/go.mod h1:xEgQu1e4stdSSsxPDK8Azkrk/ECl5HvdPf6nbZrTS5M= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c h1:TYOEhrQMrNDTAd2rX9m+WgGr8Ku6YNuj1D7OX6rWSok= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c/go.mod h1:2rC5OendXvZ8wGEo/cSLheztrZDZaSoHanUcd1xtZnw= google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8 h1:8eadJkXbwDEMNwcB5O0s5Y5eCfyuCLdvaiOIaGTrWmQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240304212257-790db918fca8/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= +google.golang.org/genproto/googleapis/api v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:SUBoKXbI1Efip18FClrQVGjWcyd0QZd8KkvdP34t7ww= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/api v0.0.0-20231030173426-d783a09b4405/go.mod h1:oT32Z4o8Zv2xPQTg0pbVaPr0MPOH6f14RgXt7zfIpwg= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= +google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= +google.golang.org/genproto/googleapis/api v0.0.0-20231212172506-995d672761c0/go.mod h1:CAny0tYF+0/9rmDB9fahA9YLzX3+AEVl1qXbv5hhj6c= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= +google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= +google.golang.org/genproto/googleapis/api v0.0.0-20240122161410-6c6643bf1457/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/api v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014/go.mod h1:rbHMSEDyoYX62nRVLOCc4Qt1HbsdytAYoVwgjiOhF3I= +google.golang.org/genproto/googleapis/api v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:PVreiBMirk8ypES6aw9d4p6iiBNSIfZEBqr3UGoAi2E= +google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230807174057-1744710a1577/go.mod h1:NjCQG/D8JandXxM57PZbAJL1DCNL6EypA0vPPwfsc7c= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0/go.mod h1:guYXGPwC6jwxgWKW5Y405fKWOFNwlvUlUnzyp9i0uqo= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:ZSvZ8l+AWJwXw91DoTjWjaVLpWU6o0eZ4YLYpH8aLeQ= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:SCz6T5xjNXM4QFPRwxHcfChp7V+9DcXR3ay2TkHR8Tg= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78 h1:Xs9lu+tLXxLIfuci70nG4cpwaRC+mRQPUL7LoIeDJC4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= -google.golang.org/grpc v1.57.2 h1:uw37EN34aMFFXB2QPW7Tq6tdTbind1GpRxw5aOX3a5k= -google.golang.org/grpc v1.57.2/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920183334-c177e329c48b/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:KSqppvjFjtoCI+KGd4PELB0qLNxdJHRGqRI09mB6pQA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231012201019-e917dd12ba7a/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231211222908-989df2bf70f3/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240122161410-6c6643bf1457/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240125205218-1f4bbc51befe/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014/go.mod h1:SaPjaZGWb0lPqs6Ittu0spdfrOArqji4ZdeP5IC/9N4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:YUWgXUFRPfoYK1IHMuxH5K6nPEXSCzIMljnQ59lLRCk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/examples v0.0.0-20211119005141-f45e61797429 h1:vh/88xB6bVCYsvXtGnKcQGJLMt2fPUFwdSJrVfS2km8= google.golang.org/grpc/examples v0.0.0-20211119005141-f45e61797429/go.mod h1:gID3PKrg7pWKntu9Ss6zTLJ0ttC0X9IHgREOCZwbCVU= @@ -2345,26 +3208,25 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= 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/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.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 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= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -2375,8 +3237,10 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -2387,27 +3251,37 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw= -k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80= -k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= -k8s.io/apimachinery v0.29.3/go.mod h1:hx/S4V2PNW4OMg3WizRrHutyB5la0iCUbZym+W0EQIU= -k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg= -k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= -k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= -k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo= +k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE= +k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U= +k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8= +k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.38.1/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.0.0-20220910160915-348f15de615a/go.mod h1:8p47QxPkdugex9J4n9P2tLZ9bK01yngIVp00g4nomW0= modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= @@ -2417,20 +3291,38 @@ modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.19.0/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.2/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/libc v1.22.4/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/sqlite v1.21.2/go.mod h1:cxbLkB5WS32DnQqeH4h4o1B0eMr8W/y8/RGuxQ3JsC0= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/tcl v1.15.1/go.mod h1:aEjeGJX2gz1oWKOLDVZ2tnEWLUrIn8H+GFu+akoDhqs= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= @@ -2439,7 +3331,7 @@ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMm sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -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= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +zenhack.net/go/util v0.0.0-20230414204917-531d38494cf5 h1:yksDCGMVzyn3vlyf0GZ3huiF5FFaMGQpQ3UJvR0EoGA= +zenhack.net/go/util v0.0.0-20230414204917-531d38494cf5/go.mod h1:1LtNdPAs8WH+BTcQiZAOo2MIKD/5jyK/u7sZ9ZPe5SE= diff --git a/internal/cortex/chunk/cache/memcached_client.go b/internal/cortex/chunk/cache/memcached_client.go index 9455f76400..1f2c514589 100644 --- a/internal/cortex/chunk/cache/memcached_client.go +++ b/internal/cortex/chunk/cache/memcached_client.go @@ -22,6 +22,7 @@ import ( "github.com/thanos-io/thanos/pkg/clientconfig" "github.com/thanos-io/thanos/pkg/discovery/dns" memcacheDiscovery "github.com/thanos-io/thanos/pkg/discovery/memcache" + "github.com/thanos-io/thanos/pkg/errors" "github.com/thanos-io/thanos/pkg/extprom" ) @@ -202,6 +203,28 @@ func (c *memcachedClient) dialViaCircuitBreaker(network, address string, timeout return conn.(net.Conn), nil } +func (c *memcachedClient) Set(item *memcache.Item) error { + // Skip hitting memcached at all if the item is bigger than the max allowed size. + if c.maxItemSize > 0 && len(item.Value) > c.maxItemSize { + c.skipped.Inc() + return nil + } + + err := c.Client.Set(item) + if err == nil { + return nil + } + + // Inject the server address in order to have more information about which memcached + // backend server failed. This is a best effort. + addr, addrErr := c.serverList.PickServer(item.Key) + if addrErr != nil { + return err + } + + return errors.Wrapf(err, "server=%s", addr) +} + func (c *memcachedClient) updateLoop(updateInterval time.Duration) { defer c.wait.Done() ticker := time.NewTicker(updateInterval) @@ -228,7 +251,7 @@ func (c *memcachedClient) updateMemcacheServers() error { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - if err := c.provider.Resolve(ctx, c.addresses); err != nil { + if err := c.provider.Resolve(ctx, c.addresses, true); err != nil { return err } servers = c.provider.Addresses() diff --git a/internal/cortex/chunk/cache/redis_cache.go b/internal/cortex/chunk/cache/redis_cache.go index 2fd30b7e80..e9caf727d4 100644 --- a/internal/cortex/chunk/cache/redis_cache.go +++ b/internal/cortex/chunk/cache/redis_cache.go @@ -70,7 +70,7 @@ func (c *RedisCache) Fetch(ctx context.Context, keys []string) (found []string, items, err = c.redis.MGet(ctx, keys) if err != nil { log.Error(err) - level.Error(c.logger).Log("msg", "failed to get from redis", "name", c.name, "err", err) + level.Debug(c.logger).Log("msg", "failed to get from redis", "name", c.name, "err", err) return err } diff --git a/internal/cortex/frontend/transport/handler.go b/internal/cortex/frontend/transport/handler.go index 602a54d027..aa3dc5718e 100644 --- a/internal/cortex/frontend/transport/handler.go +++ b/internal/cortex/frontend/transport/handler.go @@ -43,9 +43,10 @@ var ( // Config for a Handler. type HandlerConfig struct { - LogQueriesLongerThan time.Duration `yaml:"log_queries_longer_than"` - MaxBodySize int64 `yaml:"max_body_size"` - QueryStatsEnabled bool `yaml:"query_stats_enabled"` + LogQueriesLongerThan time.Duration `yaml:"log_queries_longer_than"` + MaxBodySize int64 `yaml:"max_body_size"` + QueryStatsEnabled bool `yaml:"query_stats_enabled"` + SlowQueryLogsUserHeader string `yaml:"slow_query_logs_user_header"` } // Handler accepts queries and forwards them to RoundTripper. It can log slow queries, @@ -147,21 +148,36 @@ func (f *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } // Check whether we should parse the query string. - shouldReportSlowQuery := f.cfg.LogQueriesLongerThan != 0 && queryResponseTime > f.cfg.LogQueriesLongerThan + shouldReportSlowQuery := f.cfg.LogQueriesLongerThan != 0 && + queryResponseTime > f.cfg.LogQueriesLongerThan && + isQueryEndpoint(r.URL.Path) if shouldReportSlowQuery || f.cfg.QueryStatsEnabled { queryString = f.parseRequestQueryString(r, buf) } if shouldReportSlowQuery { - f.reportSlowQuery(r, hs, queryString, queryResponseTime) + f.reportSlowQuery(r, hs, queryString, queryResponseTime, stats) } if f.cfg.QueryStatsEnabled { f.reportQueryStats(r, queryString, queryResponseTime, stats) } } +// isQueryEndpoint returns true if the path is any of the Prometheus HTTP API, +// query-related endpoints. +// Example: /api/v1/query, /api/v1/query_range, /api/v1/series, /api/v1/label, /api/v1/labels +func isQueryEndpoint(path string) bool { + return strings.HasPrefix(path, "/api/v1") +} + // reportSlowQuery reports slow queries. -func (f *Handler) reportSlowQuery(r *http.Request, responseHeaders http.Header, queryString url.Values, queryResponseTime time.Duration) { +func (f *Handler) reportSlowQuery( + r *http.Request, + responseHeaders http.Header, + queryString url.Values, + queryResponseTime time.Duration, + stats *querier_stats.Stats, +) { // NOTE(GiedriusS): see https://github.com/grafana/grafana/pull/60301 for more info. grafanaDashboardUID := "-" if dashboardUID := r.Header.Get("X-Dashboard-Uid"); dashboardUID != "" { @@ -176,7 +192,13 @@ func (f *Handler) reportSlowQuery(r *http.Request, responseHeaders http.Header, thanosTraceID = traceID } - remoteUser, _, _ := r.BasicAuth() + var remoteUser string + // Prefer reading remote user from header. Fall back to the value of basic authentication. + if f.cfg.SlowQueryLogsUserHeader != "" { + remoteUser = r.Header.Get(f.cfg.SlowQueryLogsUserHeader) + } else { + remoteUser, _, _ = r.BasicAuth() + } logMessage := append([]interface{}{ "msg", "slow query detected", @@ -191,6 +213,9 @@ func (f *Handler) reportSlowQuery(r *http.Request, responseHeaders http.Header, "trace_id", thanosTraceID, }, formatQueryString(queryString)...) + logMessage = addQueryRangeToLogMessage(logMessage, queryString) + logMessage = f.addStatsToLogMessage(logMessage, stats) + level.Info(util_log.WithContext(r.Context(), f.log)).Log(logMessage...) } @@ -224,6 +249,8 @@ func (f *Handler) reportQueryStats(r *http.Request, queryString url.Values, quer "fetched_series_count", numSeries, "fetched_chunks_bytes", numBytes, }, formatQueryString(queryString)...) + f.addStatsToLogMessage(logMessage, stats) + addQueryRangeToLogMessage(logMessage, queryString) level.Info(util_log.WithContext(r.Context(), f.log)).Log(logMessage...) } @@ -249,6 +276,40 @@ func formatQueryString(queryString url.Values) (fields []interface{}) { return fields } +func (f *Handler) addStatsToLogMessage(message []interface{}, stats *querier_stats.Stats) []interface{} { + if stats != nil { + message = append(message, "peak_samples", stats.LoadPeakSamples()) + message = append(message, "total_samples_loaded", stats.LoadTotalSamples()) + } + + return message +} + +func addQueryRangeToLogMessage(logMessage []interface{}, queryString url.Values) []interface{} { + queryRange := extractQueryRange(queryString) + if queryRange != time.Duration(0) { + logMessage = append(logMessage, "query_range_hours", int(queryRange.Hours())) + logMessage = append(logMessage, "query_range_human", queryRange.String()) + } + return logMessage +} + +// extractQueryRange extracts query range from query string. +// If start and end are not provided or are invalid, it returns a duration with zero-value. +func extractQueryRange(queryString url.Values) time.Duration { + startStr := queryString.Get("start") + endStr := queryString.Get("end") + var queryRange = time.Duration(0) + if startStr != "" && endStr != "" { + start, serr := util.ParseTime(startStr) + end, eerr := util.ParseTime(endStr) + if serr == nil && eerr == nil { + queryRange = time.Duration(end-start) * time.Millisecond + } + } + return queryRange +} + func writeError(w http.ResponseWriter, err error) { switch err { case context.Canceled: diff --git a/internal/cortex/querier/queryrange/query_range.go b/internal/cortex/querier/queryrange/query_range.go index d2d7ba4562..e2cb153914 100644 --- a/internal/cortex/querier/queryrange/query_range.go +++ b/internal/cortex/querier/queryrange/query_range.go @@ -8,7 +8,7 @@ import ( "context" stdjson "encoding/json" "fmt" - io "io" + "io" "math" "net/http" "net/url" @@ -329,6 +329,7 @@ func (prometheusCodec) DecodeRequest(_ context.Context, r *http.Request, forward result.Query = r.FormValue("query") result.Stats = r.FormValue("stats") result.Path = r.URL.Path + result.Stats = r.FormValue("stats") // Include the specified headers from http request in prometheusRequest. for _, header := range forwardHeaders { @@ -453,9 +454,7 @@ func (prometheusCodec) EncodeResponse(ctx context.Context, res Response) (*http. sp.LogFields(otlog.Int("bytes", len(b))) resp := http.Response{ - Header: http.Header{ - "Content-Type": []string{"application/json"}, - }, + Header: mergeHeaders(a.Headers), Body: io.NopCloser(bytes.NewBuffer(b)), StatusCode: http.StatusOK, ContentLength: int64(len(b)), @@ -463,6 +462,19 @@ func (prometheusCodec) EncodeResponse(ctx context.Context, res Response) (*http. return &resp, nil } +// PrometheusResponseHeader helps preserve the Header from the original Prometheus response, coming from the Tripperware. +func mergeHeaders(headers []*PrometheusResponseHeader) http.Header { + h := make(http.Header, len(headers)+1) + for _, header := range headers { + if strings.EqualFold("Content-Type", header.Name) { + continue + } + h[header.Name] = header.Values + } + h["Content-Type"] = []string{"application/json"} + return h +} + // UnmarshalJSON implements json.Unmarshaler and is used for unmarshalling // a Prometheus range query response (matrix). func (s *SampleStream) UnmarshalJSON(data []byte) error { @@ -706,6 +718,8 @@ func (s *PrometheusInstantQueryData) MarshalJSON() ([]byte, error) { func StatsMerge(resps []Response) *PrometheusResponseStats { output := map[int64]*PrometheusResponseQueryableSamplesStatsPerStep{} hasStats := false + peakSamples := int32(0) + totalSamples := int64(0) for _, resp := range resps { stats := resp.GetStats() if stats == nil { @@ -720,6 +734,11 @@ func StatsMerge(resps []Response) *PrometheusResponseStats { for _, s := range stats.Samples.TotalQueryableSamplesPerStep { output[s.GetTimestampMs()] = s } + + if stats.Samples.PeakSamples > peakSamples { + peakSamples = stats.Samples.PeakSamples + } + totalSamples += stats.Samples.TotalQueryableSamples } if !hasStats { @@ -733,10 +752,12 @@ func StatsMerge(resps []Response) *PrometheusResponseStats { sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) - result := &PrometheusResponseStats{Samples: &PrometheusResponseSamplesStats{}} + result := &PrometheusResponseStats{Samples: &PrometheusResponseSamplesStats{ + PeakSamples: peakSamples, + TotalQueryableSamples: totalSamples, + }} for _, key := range keys { result.Samples.TotalQueryableSamplesPerStep = append(result.Samples.TotalQueryableSamplesPerStep, output[key]) - result.Samples.TotalQueryableSamples += output[key].Value } return result diff --git a/internal/cortex/querier/queryrange/query_range_test.go b/internal/cortex/querier/queryrange/query_range_test.go index 121459de5e..401c9d2e12 100644 --- a/internal/cortex/querier/queryrange/query_range_test.go +++ b/internal/cortex/querier/queryrange/query_range_test.go @@ -6,7 +6,7 @@ package queryrange import ( "bytes" "context" - io "io" + "io" "net/http" "strconv" "testing" @@ -36,6 +36,20 @@ func TestRequest(t *testing.T) { url: query, expected: &parsedRequestWithHeaders, }, + { + url: "/api/v1/query_range?end=60&query=sum%28container_memory_rss%29+by+%28namespace%29&start=0&stats=all&step=14", + expected: &PrometheusRequest{ + Path: "/api/v1/query_range", + Start: 0, + End: 60_000, + Step: 14_000, + Query: "sum(container_memory_rss) by (namespace)", + Stats: "all", + Headers: []*PrometheusRequestHeader{ + {Name: "Test-Header", Values: []string{"test"}}, + }, + }, + }, { url: "api/v1/query_range?start=foo&stats=all", expectedErr: httpgrpc.Errorf(http.StatusBadRequest, "invalid parameter \"start\"; cannot parse \"foo\" to a valid timestamp"), @@ -129,7 +143,7 @@ func TestResponseWithStats(t *testing.T) { expected *PrometheusResponse }{ { - body: `{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"foo":"bar"},"values":[[1536673680,"137"],[1536673780,"137"]]}],"stats":{"samples":{"totalQueryableSamples":10,"totalQueryableSamplesPerStep":[[1536673680,5],[1536673780,5]]}},"analysis":null}}`, + body: `{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"foo":"bar"},"values":[[1536673680,"137"],[1536673780,"137"]]}],"stats":{"samples":{"peakSamples":0,"totalQueryableSamples":10,"totalQueryableSamplesPerStep":[[1536673680,5],[1536673780,5]]}},"analysis":null}}`, expected: &PrometheusResponse{ Status: "success", Data: PrometheusData{ @@ -158,7 +172,7 @@ func TestResponseWithStats(t *testing.T) { }, }, { - body: `{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"foo":"bar"},"values":[[1536673680,"137"],[1536673780,"137"]]}],"stats":{"samples":{"totalQueryableSamples":10,"totalQueryableSamplesPerStep":[[1536673680,5],[1536673780,5]]}},"analysis":{"name":"[noArgFunction]","executionTime":"1s","children":null}}}`, + body: `{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"foo":"bar"},"values":[[1536673680,"137"],[1536673780,"137"]]}],"stats":{"samples":{"peakSamples":0,"totalQueryableSamples":10,"totalQueryableSamplesPerStep":[[1536673680,5],[1536673780,5]]}},"analysis":{"name":"[noArgFunction]","executionTime":"1s","children":null}}}`, expected: &PrometheusResponse{ Status: "success", Data: PrometheusData{ @@ -211,11 +225,27 @@ func TestResponseWithStats(t *testing.T) { } resp2, err := PrometheusCodec.EncodeResponse(context.Background(), resp) require.NoError(t, err) - assert.Equal(t, response, resp2) + assert.Equal(t, prettyPrintJsonBody(t, response.Body), prettyPrintJsonBody(t, resp2.Body)) }) } } +func prettyPrintJsonBody(t *testing.T, body io.ReadCloser) string { + t.Helper() + + bodyContent, err := io.ReadAll(body) + require.NoError(t, err) + + var jsonData interface{} + err = json.Unmarshal(bodyContent, &jsonData) + require.NoError(t, err) + + prettyBytes, err := json.MarshalIndent(jsonData, "", " ") + require.NoError(t, err) + + return string(prettyBytes) +} + func TestMergeAPIResponses(t *testing.T) { for _, tc := range []struct { name string @@ -659,7 +689,7 @@ func TestMergeAPIResponses(t *testing.T) { }, }, Stats: &PrometheusResponseStats{Samples: &PrometheusResponseSamplesStats{ - TotalQueryableSamples: 25, + TotalQueryableSamples: 30, TotalQueryableSamplesPerStep: []*PrometheusResponseQueryableSamplesStatsPerStep{ {Value: 5, TimestampMs: 1000}, {Value: 5, TimestampMs: 2000}, @@ -696,7 +726,7 @@ func TestMergeAPIResponses(t *testing.T) { }, }, Stats: &PrometheusResponseStats{Samples: &PrometheusResponseSamplesStats{ - TotalQueryableSamples: 28, + TotalQueryableSamples: 36, TotalQueryableSamplesPerStep: []*PrometheusResponseQueryableSamplesStatsPerStep{ {Value: 1, TimestampMs: 1000}, {Value: 2, TimestampMs: 2000}, @@ -734,7 +764,7 @@ func TestMergeAPIResponses(t *testing.T) { }, }, Stats: &PrometheusResponseStats{Samples: &PrometheusResponseSamplesStats{ - TotalQueryableSamples: 15, + TotalQueryableSamples: 26, TotalQueryableSamplesPerStep: []*PrometheusResponseQueryableSamplesStatsPerStep{ {Value: 1, TimestampMs: 1000}, {Value: 2, TimestampMs: 2000}, @@ -769,7 +799,7 @@ func TestMergeAPIResponses(t *testing.T) { }, }, Stats: &PrometheusResponseStats{Samples: &PrometheusResponseSamplesStats{ - TotalQueryableSamples: 14, + TotalQueryableSamples: 40, TotalQueryableSamplesPerStep: []*PrometheusResponseQueryableSamplesStatsPerStep{ {Value: 2, TimestampMs: 2000}, {Value: 3, TimestampMs: 3000}, diff --git a/internal/cortex/querier/queryrange/queryrange.pb.go b/internal/cortex/querier/queryrange/queryrange.pb.go index 9ce28b017a..ec7bf968b5 100644 --- a/internal/cortex/querier/queryrange/queryrange.pb.go +++ b/internal/cortex/querier/queryrange/queryrange.pb.go @@ -828,6 +828,7 @@ func (m *PrometheusResponseStats) GetSamples() *PrometheusResponseSamplesStats { type PrometheusResponseSamplesStats struct { TotalQueryableSamples int64 `protobuf:"varint,1,opt,name=totalQueryableSamples,proto3" json:"totalQueryableSamples"` TotalQueryableSamplesPerStep []*PrometheusResponseQueryableSamplesStatsPerStep `protobuf:"bytes,2,rep,name=totalQueryableSamplesPerStep,proto3" json:"totalQueryableSamplesPerStep"` + PeakSamples int32 `protobuf:"varint,3,opt,name=peakSamples,proto3" json:"peakSamples"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -880,6 +881,13 @@ func (m *PrometheusResponseSamplesStats) GetTotalQueryableSamplesPerStep() []*Pr return nil } +func (m *PrometheusResponseSamplesStats) GetPeakSamples() int32 { + if m != nil { + return m.PeakSamples + } + return 0 +} + type PrometheusResponseQueryableSamplesStatsPerStep struct { Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` TimestampMs int64 `protobuf:"varint,2,opt,name=timestamp_ms,json=timestampMs,proto3" json:"timestamp_ms,omitempty"` @@ -1620,102 +1628,103 @@ func init() { } var fileDescriptor_9af7607b46ac39b7 = []byte{ - // 1505 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0xcd, 0x6f, 0xdb, 0x46, - 0x16, 0x0f, 0x25, 0x99, 0x96, 0x9e, 0x1c, 0x3b, 0x19, 0x7b, 0x13, 0xd9, 0xeb, 0x35, 0x1d, 0x66, - 0xb1, 0xf0, 0x66, 0x13, 0x19, 0xf0, 0x22, 0x7b, 0x08, 0xb0, 0xd9, 0x35, 0x1b, 0xb7, 0x4e, 0x91, - 0x0f, 0x67, 0x1c, 0xa4, 0x40, 0x2f, 0xc1, 0x48, 0x9a, 0xca, 0x6c, 0x28, 0x92, 0x99, 0x19, 0x26, - 0xf6, 0xad, 0x7f, 0x43, 0xd1, 0x43, 0x8f, 0x2d, 0xd0, 0x63, 0xd1, 0xbf, 0x23, 0x87, 0x1e, 0x7a, - 0x2e, 0x50, 0xb6, 0xc8, 0x91, 0xa7, 0x5e, 0x7a, 0x2f, 0xe6, 0x83, 0x22, 0x29, 0xdb, 0x32, 0x8c, - 0x5e, 0x5a, 0xf4, 0x62, 0xcd, 0xbc, 0xef, 0xf7, 0x7b, 0x6f, 0x86, 0x6f, 0x0c, 0x37, 0xfa, 0x11, - 0x13, 0xf4, 0x70, 0xf3, 0x65, 0x42, 0x99, 0x4f, 0x99, 0xfa, 0x3d, 0x62, 0x24, 0x1c, 0xd2, 0xd2, - 0xb2, 0x1b, 0xb3, 0x48, 0x44, 0x08, 0x0a, 0xca, 0xca, 0xd2, 0x30, 0x1a, 0x46, 0x8a, 0xbc, 0x29, - 0x57, 0x5a, 0x62, 0x65, 0x6d, 0x18, 0x45, 0xc3, 0x80, 0x6e, 0xaa, 0x5d, 0x2f, 0xf9, 0x68, 0x73, - 0x90, 0x30, 0x22, 0xfc, 0x28, 0x34, 0xfc, 0x55, 0xe3, 0x4d, 0xff, 0xc4, 0x3d, 0xb3, 0x30, 0xdc, - 0xe5, 0x49, 0x6d, 0x12, 0x1e, 0x69, 0x96, 0xbb, 0x0f, 0x57, 0xf7, 0x58, 0x34, 0xa2, 0xe2, 0x80, - 0x26, 0x1c, 0xd3, 0x97, 0x09, 0xe5, 0x62, 0x97, 0x92, 0x01, 0x65, 0x68, 0x19, 0x1a, 0x8f, 0xc8, - 0x88, 0x76, 0xac, 0x75, 0x6b, 0xa3, 0xe5, 0xcd, 0x64, 0xa9, 0x63, 0xdd, 0xc2, 0x8a, 0x84, 0xfe, - 0x06, 0xf6, 0x33, 0x12, 0x24, 0x94, 0x77, 0x6a, 0xeb, 0xf5, 0x82, 0x69, 0x88, 0x6e, 0x5a, 0x83, - 0xcb, 0xc7, 0xac, 0x22, 0x04, 0x8d, 0x98, 0x88, 0x03, 0x6d, 0x0f, 0xab, 0x35, 0x5a, 0x82, 0x19, - 0x2e, 0x08, 0x13, 0x9d, 0xda, 0xba, 0xb5, 0x51, 0xc7, 0x7a, 0x83, 0x2e, 0x41, 0x9d, 0x86, 0x83, - 0x4e, 0x5d, 0xd1, 0xe4, 0x52, 0xea, 0x72, 0x41, 0xe3, 0x4e, 0x43, 0x91, 0xd4, 0x1a, 0xfd, 0x17, - 0x66, 0x85, 0x3f, 0xa2, 0x51, 0x22, 0x3a, 0x33, 0xeb, 0xd6, 0x46, 0x7b, 0x6b, 0xb9, 0xab, 0xf3, - 0xec, 0xe6, 0x79, 0x76, 0xef, 0x19, 0x94, 0xbc, 0xe6, 0x9b, 0xd4, 0xb9, 0xf0, 0xf9, 0x8f, 0x8e, - 0x85, 0x73, 0x1d, 0xe9, 0x5a, 0xc1, 0xde, 0xb1, 0x55, 0x3c, 0x7a, 0x83, 0x76, 0x61, 0xbe, 0x4f, - 0xfa, 0x07, 0x7e, 0x38, 0x7c, 0x1c, 0x4b, 0x4d, 0xde, 0x99, 0x55, 0xb6, 0x57, 0xba, 0xa5, 0xaa, - 0xbd, 0x53, 0x91, 0xf0, 0x1a, 0xd2, 0x38, 0x9e, 0xd0, 0x43, 0xf7, 0x60, 0x56, 0x03, 0xc9, 0x3b, - 0xcd, 0xf5, 0xfa, 0x46, 0x7b, 0xeb, 0x7a, 0xd9, 0xc4, 0x29, 0xa0, 0xe7, 0x48, 0xe6, 0xaa, 0x06, - 0x20, 0xc1, 0x3b, 0x2d, 0x1d, 0xa5, 0xda, 0xb8, 0x4f, 0xa1, 0x53, 0x36, 0xc0, 0xe3, 0x28, 0xe4, - 0xf4, 0x37, 0x97, 0xed, 0x87, 0x1a, 0xa0, 0xe3, 0x66, 0x91, 0x0b, 0xf6, 0xbe, 0x20, 0x22, 0xe1, - 0xc6, 0x24, 0x64, 0xa9, 0x63, 0x73, 0x45, 0xc1, 0x86, 0x83, 0xde, 0x85, 0xc6, 0x3d, 0x22, 0x88, - 0x2a, 0xe3, 0x04, 0x58, 0x85, 0x45, 0x29, 0xe1, 0x5d, 0x91, 0x60, 0x65, 0xa9, 0x33, 0x3f, 0x20, - 0x82, 0xdc, 0x8c, 0x46, 0xbe, 0xa0, 0xa3, 0x58, 0x1c, 0x61, 0xa5, 0x8f, 0x6e, 0x43, 0x6b, 0x87, - 0xb1, 0x88, 0x3d, 0x3d, 0x8a, 0xa9, 0xaa, 0x7f, 0xcb, 0xbb, 0x9a, 0xa5, 0xce, 0x22, 0xcd, 0x89, - 0x25, 0x8d, 0x42, 0x12, 0xfd, 0x13, 0x66, 0xd4, 0x46, 0xf5, 0x47, 0xcb, 0x5b, 0xcc, 0x52, 0x67, - 0x41, 0xa9, 0x94, 0xc4, 0xb5, 0x04, 0xda, 0x29, 0xca, 0x32, 0xa3, 0xca, 0xf2, 0xf7, 0xd3, 0xca, - 0x52, 0x46, 0xf5, 0x58, 0x5d, 0xb6, 0xa0, 0xf9, 0x01, 0x61, 0xa1, 0x1f, 0x0e, 0x79, 0xc7, 0x56, - 0x60, 0x5e, 0xc9, 0x52, 0x07, 0xbd, 0x36, 0xb4, 0x92, 0xdf, 0xb1, 0x9c, 0xfb, 0x69, 0x0d, 0xe6, - 0xab, 0x68, 0xa0, 0x2e, 0x00, 0xa6, 0x3c, 0x09, 0x84, 0x4a, 0x58, 0xe3, 0x3b, 0x9f, 0xa5, 0x0e, - 0xb0, 0x31, 0x15, 0x97, 0x24, 0xd0, 0xff, 0xc1, 0xd6, 0x3b, 0x55, 0xc1, 0xf6, 0x56, 0xa7, 0x1c, - 0xfc, 0x3e, 0x19, 0xc5, 0x01, 0xdd, 0x17, 0x8c, 0x92, 0x91, 0x37, 0x6f, 0x70, 0xb6, 0xb5, 0x25, - 0x6c, 0xf4, 0xd0, 0xa3, 0xbc, 0xa1, 0xea, 0xaa, 0x54, 0xd7, 0xa7, 0x67, 0x2f, 0xcb, 0xcb, 0x35, - 0x9e, 0x4a, 0xab, 0x8c, 0xa7, 0x22, 0xa0, 0xbb, 0xd0, 0x24, 0x21, 0x09, 0x8e, 0xb8, 0xcf, 0x15, - 0xfa, 0xed, 0xad, 0xa5, 0xb2, 0xc9, 0x6d, 0xc3, 0xf3, 0xe6, 0xb2, 0xd4, 0x19, 0x4b, 0xe2, 0xf1, - 0xca, 0xfd, 0xa5, 0x06, 0x6b, 0x85, 0xdf, 0xfb, 0x21, 0x17, 0x24, 0x14, 0x4f, 0xa4, 0x81, 0x73, - 0x35, 0x20, 0xae, 0x34, 0xe0, 0x3f, 0x4e, 0xce, 0xaa, 0x6c, 0xfd, 0xcf, 0xde, 0x8c, 0xdf, 0xd4, - 0x60, 0xe5, 0x74, 0x64, 0xce, 0xdd, 0x98, 0x7b, 0xa5, 0xc6, 0x94, 0x15, 0xd8, 0x38, 0xbb, 0x02, - 0x5a, 0xfe, 0x0f, 0xd3, 0xa8, 0x3f, 0x5b, 0xb0, 0x3a, 0x2d, 0x11, 0x74, 0x03, 0x6c, 0xde, 0x27, - 0x01, 0x61, 0x0a, 0xae, 0xf6, 0xd6, 0xa5, 0x6e, 0xfe, 0x35, 0x36, 0x27, 0x73, 0xf7, 0x02, 0x36, - 0x12, 0xe8, 0x2e, 0xcc, 0x71, 0xc1, 0xfc, 0x70, 0xa8, 0x39, 0x06, 0xb4, 0xea, 0x69, 0x2e, 0xf1, - 0x77, 0x2f, 0xe0, 0x8a, 0x3c, 0xba, 0x09, 0xf6, 0x2b, 0xda, 0x17, 0x11, 0x33, 0xe8, 0xa0, 0xb2, - 0xe6, 0x33, 0xc5, 0x91, 0xde, 0xb4, 0x8c, 0x94, 0x1e, 0x11, 0xc1, 0xfc, 0x43, 0x93, 0x78, 0x45, - 0xfa, 0xa1, 0xe2, 0x48, 0x69, 0x2d, 0xe3, 0x35, 0xc1, 0x94, 0xc2, 0xfd, 0x0f, 0xd8, 0xcf, 0x72, - 0x0b, 0xb3, 0x5c, 0x79, 0x96, 0x67, 0xb0, 0x3e, 0x69, 0x42, 0x07, 0x85, 0x73, 0x11, 0x77, 0x17, - 0x6c, 0x6d, 0x15, 0xdd, 0x85, 0x8b, 0xbc, 0x74, 0x2b, 0xe5, 0xda, 0xa7, 0x5e, 0x5b, 0xb8, 0x2a, - 0xee, 0x06, 0xd5, 0xf1, 0xa4, 0x54, 0x6b, 0xf4, 0xa4, 0x1c, 0x92, 0xcc, 0xea, 0xc6, 0x19, 0x1d, - 0xa2, 0x85, 0x75, 0xa3, 0xb4, 0xb3, 0xd4, 0xc9, 0xd5, 0x8b, 0xb8, 0x3f, 0xab, 0xdc, 0x45, 0x27, - 0x29, 0xa2, 0xc7, 0xf0, 0x17, 0x11, 0x09, 0x12, 0xa8, 0xc2, 0x93, 0x5e, 0x90, 0x73, 0x55, 0x0c, - 0x75, 0x6f, 0x39, 0x4b, 0x9d, 0x93, 0x05, 0xf0, 0xc9, 0x64, 0xf4, 0x85, 0x05, 0xab, 0x27, 0x72, - 0xf6, 0x28, 0xdb, 0x97, 0x23, 0x8f, 0xbe, 0xe8, 0xef, 0x4c, 0x4f, 0x6e, 0x52, 0x59, 0x05, 0x6b, - 0x2c, 0x78, 0xeb, 0x59, 0xea, 0x4c, 0xf5, 0x81, 0xa7, 0x72, 0x5d, 0x1f, 0xce, 0xe9, 0x51, 0x4e, - 0x2d, 0xaf, 0xe4, 0x4c, 0xa1, 0x51, 0xc1, 0x7a, 0x83, 0xae, 0xc1, 0x9c, 0x1c, 0xbe, 0xb8, 0x20, - 0xa3, 0xf8, 0xf9, 0x88, 0x9b, 0x99, 0xaf, 0x3d, 0xa6, 0x3d, 0xe4, 0xee, 0x97, 0x35, 0x98, 0x2b, - 0xf7, 0x03, 0xfa, 0xc4, 0x02, 0x3b, 0x20, 0x3d, 0x1a, 0xe4, 0xad, 0xb3, 0x58, 0x9c, 0xaa, 0x07, - 0x92, 0xbe, 0x47, 0x7c, 0xe6, 0xed, 0xcb, 0x3b, 0xe4, 0xfb, 0xd4, 0xd9, 0x1e, 0xfa, 0xe2, 0x20, - 0xe9, 0x75, 0xfb, 0xd1, 0x68, 0x53, 0x1c, 0x90, 0x30, 0xe2, 0xb7, 0xfc, 0xc8, 0xac, 0x36, 0xfd, - 0x50, 0x50, 0x16, 0x92, 0x60, 0x73, 0x62, 0x56, 0xd6, 0x76, 0xb6, 0x07, 0x24, 0x16, 0x94, 0xc9, - 0x8b, 0x68, 0x44, 0x05, 0xf3, 0xfb, 0xd8, 0xf8, 0x45, 0x77, 0x8a, 0x46, 0xd3, 0xb5, 0x38, 0x76, - 0xb0, 0x8b, 0x3b, 0x4c, 0x25, 0x5a, 0x74, 0x14, 0xc2, 0x00, 0x07, 0x3e, 0x17, 0xd1, 0x90, 0xc9, - 0xe6, 0xaf, 0x2b, 0x75, 0xe7, 0x78, 0xf3, 0xef, 0xe6, 0x32, 0x2a, 0x9b, 0xcb, 0xc6, 0x5a, 0x6b, - 0xac, 0x8a, 0x4b, 0x56, 0xdc, 0xaf, 0x6a, 0x60, 0x9b, 0x6b, 0xe0, 0x77, 0x80, 0xce, 0xbf, 0xa0, - 0xad, 0x93, 0x55, 0x43, 0xa4, 0xaa, 0xa9, 0xe5, 0xb5, 0xb2, 0xd4, 0xd1, 0x45, 0xc7, 0x65, 0x2e, - 0x5a, 0x85, 0xd6, 0xb8, 0xda, 0x66, 0xbc, 0x2f, 0x08, 0xe8, 0x01, 0x14, 0x19, 0x9b, 0x9b, 0xea, - 0xaf, 0x53, 0xb0, 0x52, 0x38, 0x59, 0x55, 0x9c, 0x8a, 0xa5, 0xfb, 0x1e, 0xcc, 0x95, 0xaf, 0xd0, - 0x6a, 0x4f, 0xb6, 0xce, 0xd1, 0x93, 0x02, 0x16, 0x4f, 0xa8, 0x52, 0x35, 0x17, 0x6b, 0x32, 0x97, - 0xff, 0x95, 0x73, 0xa9, 0x9d, 0x9d, 0x8b, 0x7e, 0x43, 0x94, 0xc2, 0x8f, 0x61, 0x61, 0x42, 0x46, - 0x66, 0xd0, 0x8f, 0x92, 0x50, 0x28, 0x6f, 0x16, 0xd6, 0x1b, 0xf9, 0x58, 0xe2, 0x89, 0xf6, 0x61, - 0x61, 0xb9, 0x44, 0xb7, 0x61, 0xb6, 0x97, 0xf4, 0x5f, 0x50, 0x91, 0x77, 0x5c, 0xc5, 0x73, 0xe1, - 0x53, 0xc9, 0xe0, 0x5c, 0xd6, 0xe5, 0xb0, 0x30, 0xc1, 0x43, 0x6b, 0x00, 0xbd, 0x28, 0x09, 0x07, - 0x84, 0xf9, 0xe6, 0x8a, 0x9b, 0xc1, 0x25, 0x8a, 0x8c, 0x28, 0x88, 0x5e, 0x53, 0x66, 0xbc, 0xeb, - 0x8d, 0xa4, 0x26, 0x71, 0x4c, 0xf5, 0xb7, 0xc9, 0xc2, 0x7a, 0x53, 0x44, 0xdf, 0x28, 0x45, 0xef, - 0x7e, 0x0c, 0xf3, 0xf2, 0x35, 0x45, 0x07, 0xe3, 0x69, 0x6f, 0x19, 0xea, 0x2f, 0xe8, 0x91, 0x19, - 0x39, 0x66, 0xb3, 0xd4, 0x91, 0x5b, 0x2c, 0xff, 0xc8, 0x17, 0x1f, 0x3d, 0x14, 0x34, 0x14, 0xf9, - 0x49, 0xac, 0x7c, 0x85, 0x76, 0x14, 0xcb, 0x5b, 0x30, 0xa7, 0x27, 0x17, 0xc5, 0xf9, 0xc2, 0xfd, - 0xda, 0x02, 0x5b, 0x0b, 0x21, 0x27, 0x7f, 0x77, 0xea, 0x6b, 0x5b, 0xf5, 0xab, 0x22, 0xe4, 0x4f, - 0xd0, 0x65, 0xfd, 0x04, 0x55, 0xed, 0xa0, 0xa3, 0xa0, 0xe1, 0x40, 0xbf, 0x45, 0xd7, 0xa1, 0x29, - 0x18, 0xe9, 0xd3, 0xe7, 0xfe, 0xc0, 0x8c, 0x78, 0xf9, 0x3c, 0xa6, 0xc8, 0xf7, 0x07, 0x72, 0xd4, - 0x60, 0x26, 0x1d, 0xf3, 0x34, 0x5d, 0x3a, 0xf6, 0x34, 0xdd, 0x0e, 0x8f, 0xf4, 0xa8, 0x91, 0x4b, - 0xe2, 0xf1, 0xea, 0xfd, 0x46, 0xb3, 0x7e, 0xa9, 0xe1, 0xde, 0xd4, 0xd0, 0x94, 0x9e, 0x94, 0x2b, - 0xd0, 0x1c, 0xf8, 0x5c, 0x5e, 0xba, 0x03, 0x15, 0x78, 0x13, 0x8f, 0xf7, 0x6e, 0x08, 0xed, 0x9d, - 0xc3, 0x38, 0x20, 0xa1, 0x7a, 0xf0, 0xa2, 0x55, 0x68, 0x84, 0xc5, 0x2b, 0xb0, 0x99, 0xa5, 0x8e, - 0xda, 0x63, 0xf5, 0x17, 0x6d, 0x43, 0xb3, 0x7f, 0xe0, 0x07, 0x03, 0x46, 0x43, 0x83, 0xe4, 0xd5, - 0x2a, 0x92, 0x63, 0x43, 0x3a, 0xc6, 0x5c, 0x18, 0x8f, 0x57, 0xee, 0xb7, 0x16, 0x34, 0xf3, 0x99, - 0xe9, 0x0c, 0x6f, 0x3d, 0xb8, 0x48, 0x0f, 0x69, 0x3f, 0x91, 0xf6, 0x9e, 0xfa, 0xa3, 0x7c, 0xda, - 0x99, 0xf2, 0x5c, 0xbf, 0x66, 0x6e, 0xac, 0x66, 0x4e, 0xc9, 0x52, 0xa7, 0x6a, 0x03, 0x57, 0xb7, - 0x12, 0xf2, 0x71, 0x46, 0xba, 0xe9, 0xa7, 0x4c, 0x77, 0xc7, 0xd3, 0xf1, 0x3a, 0x6f, 0xde, 0xae, - 0x59, 0xdf, 0xbd, 0x5d, 0xb3, 0x7e, 0x7a, 0xbb, 0x66, 0x7d, 0x58, 0xfa, 0x87, 0x4c, 0xcf, 0x56, - 0xe1, 0xfd, 0xfb, 0xd7, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf5, 0x48, 0xa7, 0xb6, 0xd1, 0x11, 0x00, - 0x00, + // 1523 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x18, 0x3d, 0x6f, 0x1b, 0x47, + 0xd6, 0x4b, 0x52, 0x14, 0xf9, 0x28, 0x4b, 0xf6, 0x48, 0x67, 0x53, 0x3a, 0x9d, 0x56, 0x5e, 0x1f, + 0x0e, 0x3a, 0x9f, 0x4d, 0xe1, 0x74, 0xf0, 0x15, 0x06, 0xce, 0x77, 0xda, 0xb3, 0x12, 0x39, 0xf0, + 0x87, 0x3c, 0x32, 0x1c, 0x20, 0x8d, 0x31, 0x24, 0x27, 0xd4, 0xc6, 0xe4, 0xee, 0x7a, 0x66, 0xd6, + 0x96, 0xba, 0xfc, 0x86, 0x54, 0x29, 0x13, 0x20, 0x65, 0x90, 0xbf, 0x11, 0x17, 0x29, 0x52, 0x07, + 0xc8, 0x26, 0x70, 0xb9, 0x55, 0x9a, 0xf4, 0xc1, 0x7c, 0x2c, 0x77, 0x96, 0x92, 0x28, 0x08, 0x69, + 0x12, 0xa4, 0x11, 0xe7, 0x7d, 0xce, 0xfb, 0x9a, 0xb7, 0xef, 0x09, 0x6e, 0xf4, 0x22, 0x26, 0xe8, + 0xe1, 0xe6, 0xcb, 0x84, 0xb2, 0x80, 0x32, 0xf5, 0x7b, 0xc4, 0x48, 0x38, 0xa0, 0xd6, 0xb1, 0x13, + 0xb3, 0x48, 0x44, 0x08, 0x0a, 0xcc, 0xca, 0xd2, 0x20, 0x1a, 0x44, 0x0a, 0xbd, 0x29, 0x4f, 0x9a, + 0x63, 0x65, 0x6d, 0x10, 0x45, 0x83, 0x21, 0xdd, 0x54, 0x50, 0x37, 0xf9, 0x70, 0xb3, 0x9f, 0x30, + 0x22, 0x82, 0x28, 0x34, 0xf4, 0x55, 0x73, 0x9b, 0xfe, 0x89, 0xbb, 0xe6, 0x60, 0xa8, 0xcb, 0x93, + 0xd2, 0x24, 0x3c, 0xd2, 0x24, 0x6f, 0x1f, 0xae, 0xee, 0xb1, 0x68, 0x44, 0xc5, 0x01, 0x4d, 0x38, + 0xa6, 0x2f, 0x13, 0xca, 0xc5, 0x2e, 0x25, 0x7d, 0xca, 0xd0, 0x32, 0xd4, 0x1e, 0x91, 0x11, 0x6d, + 0x3b, 0xeb, 0xce, 0x46, 0xd3, 0x9f, 0xc9, 0x52, 0xd7, 0xb9, 0x85, 0x15, 0x0a, 0xfd, 0x05, 0xea, + 0xcf, 0xc8, 0x30, 0xa1, 0xbc, 0x5d, 0x59, 0xaf, 0x16, 0x44, 0x83, 0xf4, 0xd2, 0x0a, 0x5c, 0x3e, + 0xa6, 0x15, 0x21, 0xa8, 0xc5, 0x44, 0x1c, 0x68, 0x7d, 0x58, 0x9d, 0xd1, 0x12, 0xcc, 0x70, 0x41, + 0x98, 0x68, 0x57, 0xd6, 0x9d, 0x8d, 0x2a, 0xd6, 0x00, 0xba, 0x04, 0x55, 0x1a, 0xf6, 0xdb, 0x55, + 0x85, 0x93, 0x47, 0x29, 0xcb, 0x05, 0x8d, 0xdb, 0x35, 0x85, 0x52, 0x67, 0xf4, 0x1f, 0x98, 0x15, + 0xc1, 0x88, 0x46, 0x89, 0x68, 0xcf, 0xac, 0x3b, 0x1b, 0xad, 0xad, 0xe5, 0x8e, 0xf6, 0xb3, 0x93, + 0xfb, 0xd9, 0xb9, 0x67, 0xa2, 0xe4, 0x37, 0xde, 0xa4, 0xee, 0x85, 0x4f, 0x7f, 0x70, 0x1d, 0x9c, + 0xcb, 0xc8, 0xab, 0x55, 0xd8, 0xdb, 0x75, 0x65, 0x8f, 0x06, 0xd0, 0x2e, 0xcc, 0xf7, 0x48, 0xef, + 0x20, 0x08, 0x07, 0x8f, 0x63, 0x29, 0xc9, 0xdb, 0xb3, 0x4a, 0xf7, 0x4a, 0xc7, 0xca, 0xda, 0xff, + 0x4b, 0x1c, 0x7e, 0x4d, 0x2a, 0xc7, 0x13, 0x72, 0xe8, 0x1e, 0xcc, 0xea, 0x40, 0xf2, 0x76, 0x63, + 0xbd, 0xba, 0xd1, 0xda, 0xba, 0x6e, 0xab, 0x38, 0x25, 0xe8, 0x79, 0x24, 0x73, 0x51, 0x13, 0x20, + 0xc1, 0xdb, 0x4d, 0x6d, 0xa5, 0x02, 0xbc, 0xa7, 0xd0, 0xb6, 0x15, 0xf0, 0x38, 0x0a, 0x39, 0xfd, + 0xd5, 0x69, 0xfb, 0xbe, 0x02, 0xe8, 0xb8, 0x5a, 0xe4, 0x41, 0x7d, 0x5f, 0x10, 0x91, 0x70, 0xa3, + 0x12, 0xb2, 0xd4, 0xad, 0x73, 0x85, 0xc1, 0x86, 0x82, 0xde, 0x81, 0xda, 0x3d, 0x22, 0x88, 0x4a, + 0xe3, 0x44, 0xb0, 0x0a, 0x8d, 0x92, 0xc3, 0xbf, 0x22, 0x83, 0x95, 0xa5, 0xee, 0x7c, 0x9f, 0x08, + 0x72, 0x33, 0x1a, 0x05, 0x82, 0x8e, 0x62, 0x71, 0x84, 0x95, 0x3c, 0xba, 0x0d, 0xcd, 0x1d, 0xc6, + 0x22, 0xf6, 0xf4, 0x28, 0xa6, 0x2a, 0xff, 0x4d, 0xff, 0x6a, 0x96, 0xba, 0x8b, 0x34, 0x47, 0x5a, + 0x12, 0x05, 0x27, 0xfa, 0x3b, 0xcc, 0x28, 0x40, 0xd5, 0x47, 0xd3, 0x5f, 0xcc, 0x52, 0x77, 0x41, + 0x89, 0x58, 0xec, 0x9a, 0x03, 0xed, 0x14, 0x69, 0x99, 0x51, 0x69, 0xf9, 0xeb, 0x69, 0x69, 0xb1, + 0xa3, 0x7a, 0x2c, 0x2f, 0x5b, 0xd0, 0x78, 0x9f, 0xb0, 0x30, 0x08, 0x07, 0xbc, 0x5d, 0x57, 0xc1, + 0xbc, 0x92, 0xa5, 0x2e, 0x7a, 0x6d, 0x70, 0xd6, 0xbd, 0x63, 0x3e, 0xef, 0x93, 0x0a, 0xcc, 0x97, + 0xa3, 0x81, 0x3a, 0x00, 0x98, 0xf2, 0x64, 0x28, 0x94, 0xc3, 0x3a, 0xbe, 0xf3, 0x59, 0xea, 0x02, + 0x1b, 0x63, 0xb1, 0xc5, 0x81, 0xfe, 0x07, 0x75, 0x0d, 0xa9, 0x0c, 0xb6, 0xb6, 0xda, 0xb6, 0xf1, + 0xfb, 0x64, 0x14, 0x0f, 0xe9, 0xbe, 0x60, 0x94, 0x8c, 0xfc, 0x79, 0x13, 0xe7, 0xba, 0xd6, 0x84, + 0x8d, 0x1c, 0x7a, 0x94, 0x17, 0x54, 0x55, 0xa5, 0xea, 0xfa, 0x74, 0xef, 0x65, 0x7a, 0xb9, 0x8e, + 0xa7, 0x92, 0xb2, 0xe3, 0xa9, 0x10, 0xe8, 0x2e, 0x34, 0x48, 0x48, 0x86, 0x47, 0x3c, 0xe0, 0x2a, + 0xfa, 0xad, 0xad, 0x25, 0x5b, 0xe5, 0xb6, 0xa1, 0xf9, 0x73, 0x59, 0xea, 0x8e, 0x39, 0xf1, 0xf8, + 0xe4, 0xfd, 0x5c, 0x81, 0xb5, 0xe2, 0xde, 0xfb, 0x21, 0x17, 0x24, 0x14, 0x4f, 0xa4, 0x82, 0x73, + 0x15, 0x20, 0x2e, 0x15, 0xe0, 0xdf, 0x4e, 0xf6, 0xca, 0xd6, 0xfe, 0x47, 0x2f, 0xc6, 0xaf, 0x2a, + 0xb0, 0x72, 0x7a, 0x64, 0xce, 0x5d, 0x98, 0x7b, 0x56, 0x61, 0xca, 0x0c, 0x6c, 0x9c, 0x9d, 0x01, + 0xcd, 0xff, 0xbb, 0x29, 0xd4, 0x9f, 0x1c, 0x58, 0x9d, 0xe6, 0x08, 0xba, 0x01, 0x75, 0xde, 0x23, + 0x43, 0xc2, 0x54, 0xb8, 0x5a, 0x5b, 0x97, 0x3a, 0xf9, 0xd7, 0xd8, 0xbc, 0xcc, 0xdd, 0x0b, 0xd8, + 0x70, 0xa0, 0xbb, 0x30, 0xc7, 0x05, 0x0b, 0xc2, 0x81, 0xa6, 0x98, 0xa0, 0x95, 0x5f, 0xb3, 0x45, + 0xdf, 0xbd, 0x80, 0x4b, 0xfc, 0xe8, 0x26, 0xd4, 0x5f, 0xd1, 0x9e, 0x88, 0x98, 0x89, 0x0e, 0xb2, + 0x25, 0x9f, 0x29, 0x8a, 0xbc, 0x4d, 0xf3, 0x48, 0xee, 0x11, 0x11, 0x2c, 0x38, 0x34, 0x8e, 0x97, + 0xb8, 0x1f, 0x2a, 0x8a, 0xe4, 0xd6, 0x3c, 0x7e, 0x03, 0x4c, 0x2a, 0xbc, 0x7f, 0x43, 0xfd, 0x59, + 0xae, 0x61, 0x96, 0xab, 0x9b, 0xe5, 0x1b, 0xac, 0x4e, 0xaa, 0xd0, 0x46, 0xe1, 0x9c, 0xc5, 0xdb, + 0x85, 0xba, 0xd6, 0x8a, 0xee, 0xc2, 0x45, 0x6e, 0x75, 0xa5, 0x5c, 0xfa, 0xd4, 0xb6, 0x85, 0xcb, + 0xec, 0xde, 0xb0, 0x3c, 0x9e, 0x58, 0xb9, 0x46, 0x4f, 0x6c, 0x93, 0xa4, 0x57, 0x37, 0xce, 0xa8, + 0x10, 0xcd, 0xac, 0x0b, 0xa5, 0x95, 0xa5, 0x6e, 0x2e, 0x5e, 0xd8, 0xfd, 0x75, 0xa9, 0x17, 0x9d, + 0x24, 0x88, 0x1e, 0xc3, 0x9f, 0x44, 0x24, 0xc8, 0x50, 0x25, 0x9e, 0x74, 0x87, 0x39, 0x55, 0xd9, + 0x50, 0xf5, 0x97, 0xb3, 0xd4, 0x3d, 0x99, 0x01, 0x9f, 0x8c, 0x46, 0x9f, 0x39, 0xb0, 0x7a, 0x22, + 0x65, 0x8f, 0xb2, 0x7d, 0x39, 0xf2, 0xe8, 0x46, 0x7f, 0x67, 0xba, 0x73, 0x93, 0xc2, 0xca, 0x58, + 0xa3, 0xc1, 0x5f, 0xcf, 0x52, 0x77, 0xea, 0x1d, 0x78, 0x2a, 0x15, 0xfd, 0x13, 0x5a, 0x31, 0x25, + 0x2f, 0x72, 0x4f, 0x65, 0xc5, 0xcd, 0xf8, 0x0b, 0x59, 0xea, 0xda, 0x68, 0x6c, 0x03, 0x5e, 0x00, + 0xe7, 0x34, 0x52, 0x0e, 0x3a, 0xaf, 0xe4, 0x18, 0xa2, 0x03, 0x89, 0x35, 0x80, 0xae, 0xc1, 0x9c, + 0x9c, 0xd7, 0xb8, 0x20, 0xa3, 0xf8, 0xf9, 0x88, 0x9b, 0x31, 0xb1, 0x35, 0xc6, 0x3d, 0xe4, 0xde, + 0xe7, 0x15, 0x98, 0xb3, 0x4b, 0x08, 0x7d, 0xec, 0x40, 0x7d, 0x48, 0xba, 0x74, 0x98, 0x57, 0xdb, + 0x62, 0xf1, 0x10, 0x1f, 0x48, 0xfc, 0x1e, 0x09, 0x98, 0xbf, 0x2f, 0xdb, 0xce, 0x77, 0xa9, 0xbb, + 0x3d, 0x08, 0xc4, 0x41, 0xd2, 0xed, 0xf4, 0xa2, 0xd1, 0xa6, 0x38, 0x20, 0x61, 0xc4, 0x6f, 0x05, + 0x91, 0x39, 0x6d, 0x06, 0xa1, 0xa0, 0x2c, 0x24, 0xc3, 0xcd, 0x89, 0xf1, 0x5a, 0xeb, 0xd9, 0xee, + 0x93, 0x58, 0x50, 0x26, 0x7b, 0xd7, 0x88, 0x0a, 0x16, 0xf4, 0xb0, 0xb9, 0x17, 0xdd, 0x29, 0x6a, + 0x53, 0xa7, 0xef, 0x58, 0x2f, 0x28, 0xda, 0x9e, 0x72, 0xb4, 0x28, 0x42, 0x84, 0x01, 0x0e, 0x02, + 0x2e, 0xa2, 0x01, 0x93, 0xef, 0xa5, 0xaa, 0xc4, 0xdd, 0xe3, 0xef, 0x65, 0x37, 0xe7, 0x51, 0xde, + 0x5c, 0x36, 0xda, 0x9a, 0x63, 0x51, 0x6c, 0x69, 0xf1, 0xbe, 0xa8, 0x40, 0xdd, 0x74, 0x8e, 0xdf, + 0x40, 0x74, 0xfe, 0x01, 0x2d, 0xed, 0xac, 0x9a, 0x3b, 0x55, 0x4e, 0x1d, 0xbf, 0x99, 0xa5, 0xae, + 0x4e, 0x3a, 0xb6, 0xa9, 0x68, 0x15, 0x9a, 0xe3, 0x6c, 0x9b, 0x8d, 0xa0, 0x40, 0xa0, 0x07, 0x50, + 0x78, 0x6c, 0x9a, 0xdb, 0x9f, 0xa7, 0xc4, 0x4a, 0xc5, 0xc9, 0x29, 0xc7, 0xa9, 0x38, 0x7a, 0xef, + 0xc2, 0x9c, 0xdd, 0x75, 0xcb, 0x35, 0xd9, 0x3c, 0x47, 0x4d, 0x0a, 0x58, 0x3c, 0x21, 0x4b, 0x65, + 0x5f, 0x9c, 0x49, 0x5f, 0xfe, 0x6b, 0xfb, 0x52, 0x39, 0xdb, 0x17, 0xbd, 0x76, 0x58, 0xe6, 0xc7, + 0xb0, 0x30, 0xc1, 0x23, 0x3d, 0xe8, 0x45, 0x49, 0x28, 0xd4, 0x6d, 0x0e, 0xd6, 0x80, 0xdc, 0xaf, + 0x78, 0xa2, 0xef, 0x70, 0xb0, 0x3c, 0xa2, 0xdb, 0x30, 0xdb, 0x4d, 0x7a, 0x2f, 0xa8, 0xc8, 0x2b, + 0xae, 0x74, 0x73, 0x71, 0xa7, 0xe2, 0xc1, 0x39, 0xaf, 0xc7, 0x61, 0x61, 0x82, 0x86, 0xd6, 0x00, + 0xba, 0x51, 0x12, 0xf6, 0x09, 0x0b, 0x4c, 0x57, 0x9c, 0xc1, 0x16, 0x46, 0x5a, 0x34, 0x8c, 0x5e, + 0x53, 0x66, 0x6e, 0xd7, 0x80, 0xc4, 0x26, 0x71, 0x4c, 0xf5, 0xe7, 0xcc, 0xc1, 0x1a, 0x28, 0xac, + 0xaf, 0x59, 0xd6, 0x7b, 0x1f, 0xc1, 0xbc, 0x5c, 0xc0, 0x68, 0x7f, 0x3c, 0x20, 0x2e, 0x43, 0xf5, + 0x05, 0x3d, 0x32, 0x53, 0xca, 0x6c, 0x96, 0xba, 0x12, 0xc4, 0xf2, 0x8f, 0x5c, 0x12, 0xe9, 0xa1, + 0xa0, 0xa1, 0xc8, 0x5f, 0x62, 0xe9, 0xc3, 0xb5, 0xa3, 0x48, 0xfe, 0x82, 0x79, 0x3d, 0x39, 0x2b, + 0xce, 0x0f, 0xde, 0x97, 0x0e, 0xd4, 0x35, 0x13, 0x72, 0xf3, 0x55, 0x55, 0x77, 0x7a, 0x55, 0xaf, + 0x0a, 0x91, 0x6f, 0xad, 0xcb, 0x7a, 0x6b, 0x55, 0xe5, 0xa0, 0xad, 0xa0, 0x61, 0x5f, 0xaf, 0xaf, + 0xeb, 0xd0, 0x10, 0x8c, 0xf4, 0xe8, 0xf3, 0xa0, 0x6f, 0xa6, 0xc2, 0x7c, 0x84, 0x53, 0xe8, 0xfb, + 0x7d, 0x39, 0x9d, 0x30, 0xe3, 0x8e, 0xd9, 0x66, 0x97, 0x8e, 0x6d, 0xb3, 0xdb, 0xe1, 0x91, 0x9e, + 0x4e, 0x72, 0x4e, 0x3c, 0x3e, 0xbd, 0x57, 0x6b, 0x54, 0x2f, 0xd5, 0xbc, 0x9b, 0x3a, 0x34, 0xd6, + 0x16, 0xba, 0x02, 0x8d, 0x7e, 0xc0, 0x65, 0xd3, 0xed, 0x2b, 0xc3, 0x1b, 0x78, 0x0c, 0x7b, 0x21, + 0xb4, 0x76, 0x0e, 0xe3, 0x21, 0x09, 0xd5, 0x8e, 0x8c, 0x56, 0xa1, 0x16, 0x16, 0x8b, 0x63, 0x23, + 0x4b, 0x5d, 0x05, 0x63, 0xf5, 0x17, 0x6d, 0x43, 0xa3, 0x77, 0x10, 0x0c, 0xfb, 0x8c, 0x86, 0x26, + 0x92, 0x57, 0xcb, 0x91, 0x1c, 0x2b, 0xd2, 0x36, 0xe6, 0xcc, 0x78, 0x7c, 0xf2, 0xbe, 0x71, 0xa0, + 0x91, 0x8f, 0x59, 0x67, 0xdc, 0xd6, 0x85, 0x8b, 0xf4, 0x90, 0xf6, 0x12, 0xa9, 0xef, 0x69, 0x30, + 0xca, 0x07, 0xa4, 0x29, 0x1b, 0xfe, 0x35, 0xd3, 0xb1, 0x1a, 0x39, 0x26, 0x4b, 0xdd, 0xb2, 0x0e, + 0x5c, 0x06, 0x65, 0xc8, 0xc7, 0x1e, 0xe9, 0xa2, 0x9f, 0x32, 0x10, 0x1e, 0x77, 0xc7, 0x6f, 0xbf, + 0x79, 0xbb, 0xe6, 0x7c, 0xfb, 0x76, 0xcd, 0xf9, 0xf1, 0xed, 0x9a, 0xf3, 0x81, 0xf5, 0x3f, 0x9c, + 0x6e, 0x5d, 0x99, 0xf7, 0xaf, 0x5f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xc7, 0x1d, 0xa3, 0x04, + 0x12, 0x00, 0x00, } func (m *PrometheusRequestHeader) Marshal() (dAtA []byte, err error) { @@ -2466,6 +2475,11 @@ func (m *PrometheusResponseSamplesStats) MarshalToSizedBuffer(dAtA []byte) (int, i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.PeakSamples != 0 { + i = encodeVarintQueryrange(dAtA, i, uint64(m.PeakSamples)) + i-- + dAtA[i] = 0x18 + } if len(m.TotalQueryableSamplesPerStep) > 0 { for iNdEx := len(m.TotalQueryableSamplesPerStep) - 1; iNdEx >= 0; iNdEx-- { { @@ -3449,6 +3463,9 @@ func (m *PrometheusResponseSamplesStats) Size() (n int) { n += 1 + l + sovQueryrange(uint64(l)) } } + if m.PeakSamples != 0 { + n += 1 + sovQueryrange(uint64(m.PeakSamples)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -5663,6 +5680,25 @@ func (m *PrometheusResponseSamplesStats) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PeakSamples", wireType) + } + m.PeakSamples = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQueryrange + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PeakSamples |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipQueryrange(dAtA[iNdEx:]) diff --git a/internal/cortex/querier/queryrange/queryrange.proto b/internal/cortex/querier/queryrange/queryrange.proto index 21edc5783c..281ae02011 100644 --- a/internal/cortex/querier/queryrange/queryrange.proto +++ b/internal/cortex/querier/queryrange/queryrange.proto @@ -92,6 +92,7 @@ message PrometheusResponseStats { message PrometheusResponseSamplesStats { int64 totalQueryableSamples = 1 [(gogoproto.jsontag) = "totalQueryableSamples"]; repeated PrometheusResponseQueryableSamplesStatsPerStep totalQueryableSamplesPerStep = 2 [(gogoproto.jsontag) = "totalQueryableSamplesPerStep"]; + int32 peakSamples = 3 [(gogoproto.jsontag) = "peakSamples"]; } message PrometheusResponseQueryableSamplesStatsPerStep { diff --git a/internal/cortex/querier/queryrange/results_cache.go b/internal/cortex/querier/queryrange/results_cache.go index ae012200f6..a3399e2551 100644 --- a/internal/cortex/querier/queryrange/results_cache.go +++ b/internal/cortex/querier/queryrange/results_cache.go @@ -7,6 +7,7 @@ import ( "context" "flag" "fmt" + "github.com/thanos-io/thanos/pkg/extpromql" "net/http" "sort" "strings" @@ -325,7 +326,7 @@ func (s resultsCache) isAtModifierCachable(r Request, maxCacheTime int64) bool { if !strings.Contains(query, "@") { return true } - expr, err := parser.ParseExpr(query) + expr, err := extpromql.ParseExpr(query) if err != nil { // We are being pessimistic in such cases. level.Warn(s.logger).Log("msg", "failed to parse query, considering @ modifier as not cachable", "query", query, "err", err) @@ -370,7 +371,7 @@ func (s resultsCache) isOffsetCachable(r Request) bool { if !strings.Contains(query, "offset") { return true } - expr, err := parser.ParseExpr(query) + expr, err := extpromql.ParseExpr(query) if err != nil { level.Warn(s.logger).Log("msg", "failed to parse query, considering offset as not cachable", "query", query, "err", err) return false diff --git a/internal/cortex/querier/queryrange/split_by_interval.go b/internal/cortex/querier/queryrange/split_by_interval.go index 039306e880..2ae53f7c50 100644 --- a/internal/cortex/querier/queryrange/split_by_interval.go +++ b/internal/cortex/querier/queryrange/split_by_interval.go @@ -5,6 +5,7 @@ package queryrange import ( "context" + "github.com/thanos-io/thanos/pkg/extpromql" "net/http" "time" @@ -97,7 +98,7 @@ func splitQuery(r Request, interval time.Duration) ([]Request, error) { // For example given the start of the query is 10.00, `http_requests_total[1h] @ start()` query will be replaced with `http_requests_total[1h] @ 10.00` // If the modifier is already a constant, it will be returned as is. func EvaluateAtModifierFunction(query string, start, end int64) (string, error) { - expr, err := parser.ParseExpr(query) + expr, err := extpromql.ParseExpr(query) if err != nil { return "", httpgrpc.Errorf(http.StatusBadRequest, `{"status": "error", "error": "%s"}`, err) } diff --git a/internal/cortex/querier/queryrange/split_by_interval_test.go b/internal/cortex/querier/queryrange/split_by_interval_test.go index bd0e96b35d..00654a911c 100644 --- a/internal/cortex/querier/queryrange/split_by_interval_test.go +++ b/internal/cortex/querier/queryrange/split_by_interval_test.go @@ -13,7 +13,8 @@ import ( "testing" "time" - "github.com/prometheus/prometheus/promql/parser" + "github.com/thanos-io/thanos/pkg/extpromql" + "github.com/stretchr/testify/require" "github.com/weaveworks/common/httpgrpc" "github.com/weaveworks/common/middleware" @@ -332,6 +333,11 @@ func Test_evaluateAtModifier(t *testing.T) { in: "topk(5, rate(http_requests_total[1h] @ start()))", expected: "topk(5, rate(http_requests_total[1h] @ 1546300.800))", }, + { + // extended functions + in: "topk(5, xrate(http_requests_total[1h] @ start()))", + expected: "topk(5, xrate(http_requests_total[1h] @ 1546300.800))", + }, { in: "topk(5, rate(http_requests_total[1h] @ 0))", expected: "topk(5, rate(http_requests_total[1h] @ 0.000))", @@ -368,11 +374,6 @@ func Test_evaluateAtModifier(t *testing.T) { [2m:]) [10m:])`, }, - { - // parse error: missing unit character in duration - in: "http_requests_total[5] @ 10.001", - expectedErrorCode: http.StatusBadRequest, - }, { // parse error: @ modifier must be preceded by an instant vector selector or range vector selector or a subquery in: "sum(http_requests_total[5m]) @ 10.001", @@ -390,7 +391,7 @@ func Test_evaluateAtModifier(t *testing.T) { require.Equal(t, tt.expectedErrorCode, int(httpResp.Code)) } else { require.NoError(t, err) - expectedExpr, err := parser.ParseExpr(tt.expected) + expectedExpr, err := extpromql.ParseExpr(tt.expected) require.NoError(t, err) require.Equal(t, expectedExpr.String(), out) } diff --git a/internal/cortex/querier/queryrange/stats_middleware.go b/internal/cortex/querier/queryrange/stats_middleware.go new file mode 100644 index 0000000000..d863d969c8 --- /dev/null +++ b/internal/cortex/querier/queryrange/stats_middleware.go @@ -0,0 +1,43 @@ +// Copyright (c) The Cortex Authors. +// Licensed under the Apache License 2.0. + +package queryrange + +import ( + "context" + + "github.com/thanos-io/thanos/internal/cortex/querier/stats" +) + +type statsMiddleware struct { + next Handler + forceStats bool +} + +func NewStatsMiddleware(forceStats bool) Middleware { + return MiddlewareFunc(func(next Handler) Handler { + return statsMiddleware{ + next: next, + forceStats: forceStats, + } + }) +} + +func (s statsMiddleware) Do(ctx context.Context, r Request) (Response, error) { + if s.forceStats { + r = r.WithStats("all") + } + resp, err := s.next.Do(ctx, r) + if err != nil { + return resp, err + } + + if resp.GetStats() != nil { + if sts := stats.FromContext(ctx); sts != nil { + sts.SetPeakSamples(max(sts.LoadPeakSamples(), resp.GetStats().Samples.PeakSamples)) + sts.AddTotalSamples(resp.GetStats().Samples.TotalQueryableSamples) + } + } + + return resp, err +} diff --git a/internal/cortex/querier/queryrange/stats_middleware_test.go b/internal/cortex/querier/queryrange/stats_middleware_test.go new file mode 100644 index 0000000000..665b0313a1 --- /dev/null +++ b/internal/cortex/querier/queryrange/stats_middleware_test.go @@ -0,0 +1,101 @@ +// Copyright (c) The Cortex Authors. +// Licensed under the Apache License 2.0. + +package queryrange + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/thanos-io/thanos/internal/cortex/querier/stats" +) + +func Test_statsMiddleware_AddsHeaderWithStats(t *testing.T) { + t.Parallel() + tests := []struct { + name string + forceStats bool + peakSamples int32 + totalSamples int64 + }{ + { + name: "With forceStats true", + forceStats: true, + peakSamples: 100, + totalSamples: 1000, + }, + { + name: "With forceStats false", + forceStats: false, + peakSamples: 200, + totalSamples: 2000, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + fakeHandler := &fakeHandler{ + response: &PrometheusResponse{ + Status: "success", + Data: PrometheusData{ + ResultType: "vector", + Result: []SampleStream{}, + Stats: &PrometheusResponseStats{ + Samples: &PrometheusResponseSamplesStats{ + TotalQueryableSamples: tt.totalSamples, + PeakSamples: tt.peakSamples, + }, + }, + }, + }, + } + + middleware := NewStatsMiddleware(tt.forceStats) + wrappedHandler := middleware.Wrap(fakeHandler) + + origCtx := context.Background() + qryStats, ctx := stats.ContextWithEmptyStats(origCtx) + + resp, err := wrappedHandler.Do(ctx, &PrometheusRequest{ + Path: "/api/v1/query_range", + Start: 1536673680 * 1e3, + End: 1536716898 * 1e3, + Step: 120 * 1e3, + Query: "sum(container_memory_rss) by (namespace)", + Headers: []*PrometheusRequestHeader{ + { + Name: "Accept", + Values: []string{"application/json"}, + }, + }, + }) + require.NoError(t, err) + + if tt.forceStats { + require.Equal(t, fakeHandler.request.GetStats(), "all") + } + + promResp, ok := resp.(*PrometheusResponse) + require.True(t, ok) + + assert.Equal(t, qryStats.LoadPeakSamples(), tt.peakSamples) + assert.Equal(t, qryStats.LoadTotalSamples(), tt.totalSamples) + assert.Equal(t, promResp.Data.Stats.Samples.PeakSamples, tt.peakSamples) + assert.Equal(t, promResp.Data.Stats.Samples.TotalQueryableSamples, tt.totalSamples) + }) + } +} + +type fakeHandler struct { + request Request + response Response +} + +func (f *fakeHandler) Do(ctx context.Context, r Request) (Response, error) { + f.request = r + return f.response, nil +} diff --git a/internal/cortex/querier/stats/stats.go b/internal/cortex/querier/stats/stats.go index 99cd5c5f75..9666816260 100644 --- a/internal/cortex/querier/stats/stats.go +++ b/internal/cortex/querier/stats/stats.go @@ -89,6 +89,38 @@ func (s *Stats) LoadFetchedChunkBytes() uint64 { return atomic.LoadUint64(&s.FetchedChunkBytes) } +func (s *Stats) SetPeakSamples(peakSamples int32) { + if s == nil { + return + } + + atomic.StoreInt32(&s.PeakLoadedSamples, peakSamples) +} + +func (s *Stats) LoadPeakSamples() int32 { + if s == nil { + return 0 + } + + return atomic.LoadInt32(&s.PeakLoadedSamples) +} + +func (s *Stats) AddTotalSamples(totalSamples int64) { + if s == nil { + return + } + + atomic.AddInt64(&s.TotalLoadedSamples, totalSamples) +} + +func (s *Stats) LoadTotalSamples() int64 { + if s == nil { + return 0 + } + + return atomic.LoadInt64(&s.TotalLoadedSamples) +} + // Merge the provide Stats into this one. func (s *Stats) Merge(other *Stats) { if s == nil || other == nil { diff --git a/internal/cortex/querier/stats/stats.pb.go b/internal/cortex/querier/stats/stats.pb.go index 9fd4affc1f..1f7912aff4 100644 --- a/internal/cortex/querier/stats/stats.pb.go +++ b/internal/cortex/querier/stats/stats.pb.go @@ -1,19 +1,18 @@ // Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: stats.proto +// source: cortex/querier/stats/stats.proto package stats import ( fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "github.com/golang/protobuf/ptypes/duration" + io "io" math "math" math_bits "math/bits" - reflect "reflect" - strings "strings" time "time" ) @@ -36,12 +35,20 @@ type Stats struct { FetchedSeriesCount uint64 `protobuf:"varint,2,opt,name=fetched_series_count,json=fetchedSeriesCount,proto3" json:"fetched_series_count,omitempty"` // The number of bytes of the chunks fetched for the query FetchedChunkBytes uint64 `protobuf:"varint,3,opt,name=fetched_chunk_bytes,json=fetchedChunkBytes,proto3" json:"fetched_chunk_bytes,omitempty"` + // The maximum number of samples loaded in a single execution window. + PeakLoadedSamples int32 `protobuf:"varint,4,opt,name=peak_loaded_samples,json=peakLoadedSamples,proto3" json:"peak_loaded_samples,omitempty"` + // The total number of samples loaded for the query + TotalLoadedSamples int64 `protobuf:"varint,5,opt,name=total_loaded_samples,json=totalLoadedSamples,proto3" json:"total_loaded_samples,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *Stats) Reset() { *m = Stats{} } -func (*Stats) ProtoMessage() {} +func (m *Stats) Reset() { *m = Stats{} } +func (m *Stats) String() string { return proto.CompactTextString(m) } +func (*Stats) ProtoMessage() {} func (*Stats) Descriptor() ([]byte, []int) { - return fileDescriptor_b4756a0aec8b9d44, []int{0} + return fileDescriptor_993e99dbe6209dce, []int{0} } func (m *Stats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -91,84 +98,48 @@ func (m *Stats) GetFetchedChunkBytes() uint64 { return 0 } -func init() { - proto.RegisterType((*Stats)(nil), "stats.Stats") +func (m *Stats) GetPeakLoadedSamples() int32 { + if m != nil { + return m.PeakLoadedSamples + } + return 0 } -func init() { proto.RegisterFile("stats.proto", fileDescriptor_b4756a0aec8b9d44) } +func (m *Stats) GetTotalLoadedSamples() int64 { + if m != nil { + return m.TotalLoadedSamples + } + return 0 +} -var fileDescriptor_b4756a0aec8b9d44 = []byte{ - // 281 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0xd0, 0xb1, 0x4e, 0x83, 0x40, - 0x1c, 0xc7, 0xf1, 0xfb, 0xab, 0x35, 0x95, 0x4e, 0xa2, 0x03, 0x76, 0xf8, 0xb7, 0x71, 0xea, 0xe2, - 0xd5, 0xe8, 0xe8, 0x62, 0xa8, 0x4f, 0xd0, 0x3a, 0xb9, 0x10, 0xa0, 0x57, 0x20, 0x02, 0x67, 0xe0, - 0x2e, 0xc6, 0xcd, 0x47, 0x70, 0xf4, 0x11, 0x4c, 0x7c, 0x91, 0x8e, 0x8c, 0x9d, 0x54, 0x8e, 0xc5, - 0xb1, 0x8f, 0x60, 0xee, 0xa0, 0x71, 0xe3, 0x97, 0x0f, 0xdf, 0x4b, 0xee, 0xac, 0x41, 0x29, 0x7c, - 0x51, 0xd2, 0xa7, 0x82, 0x0b, 0x6e, 0xf7, 0xcc, 0x18, 0x5e, 0x44, 0x89, 0x88, 0x65, 0x40, 0x43, - 0x9e, 0x4d, 0x23, 0x1e, 0xf1, 0xa9, 0xd1, 0x40, 0xae, 0xcc, 0x32, 0xc3, 0x7c, 0xb5, 0xd5, 0x10, - 0x23, 0xce, 0xa3, 0x94, 0xfd, 0xff, 0xb5, 0x94, 0x85, 0x2f, 0x12, 0x9e, 0xb7, 0x7e, 0xfe, 0x09, - 0x56, 0x6f, 0xa1, 0x0f, 0xb6, 0x6f, 0xad, 0xa3, 0x67, 0x3f, 0x4d, 0x3d, 0x91, 0x64, 0xcc, 0x81, - 0x31, 0x4c, 0x06, 0x57, 0x67, 0xb4, 0xad, 0xe9, 0xae, 0xa6, 0x77, 0x5d, 0xed, 0xf6, 0xd7, 0x5f, - 0x23, 0xf2, 0xfe, 0x3d, 0x82, 0x79, 0x5f, 0x57, 0xf7, 0x49, 0xc6, 0xec, 0x4b, 0xeb, 0x74, 0xc5, - 0x44, 0x18, 0xb3, 0xa5, 0x57, 0xb2, 0x22, 0x61, 0xa5, 0x17, 0x72, 0x99, 0x0b, 0x67, 0x6f, 0x0c, - 0x93, 0x83, 0xb9, 0xdd, 0xd9, 0xc2, 0xd0, 0x4c, 0x8b, 0x4d, 0xad, 0x93, 0x5d, 0x11, 0xc6, 0x32, - 0x7f, 0xf4, 0x82, 0x17, 0xc1, 0x4a, 0x67, 0xdf, 0x04, 0xc7, 0x1d, 0xcd, 0xb4, 0xb8, 0x1a, 0xdc, - 0x9b, 0xaa, 0x46, 0xb2, 0xa9, 0x91, 0x6c, 0x6b, 0x84, 0x57, 0x85, 0xf0, 0xa1, 0x10, 0xd6, 0x0a, - 0xa1, 0x52, 0x08, 0x3f, 0x0a, 0xe1, 0x57, 0x21, 0xd9, 0x2a, 0x84, 0xb7, 0x06, 0x49, 0xd5, 0x20, - 0xd9, 0x34, 0x48, 0x1e, 0xda, 0x97, 0x0b, 0x0e, 0xcd, 0x2d, 0xae, 0xff, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x9d, 0xf1, 0x86, 0xb8, 0x56, 0x01, 0x00, 0x00, +func init() { + proto.RegisterType((*Stats)(nil), "stats.Stats") } -func (this *Stats) Equal(that interface{}) bool { - if that == nil { - return this == nil - } +func init() { proto.RegisterFile("cortex/querier/stats/stats.proto", fileDescriptor_993e99dbe6209dce) } - that1, ok := that.(*Stats) - if !ok { - that2, ok := that.(Stats) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.WallTime != that1.WallTime { - return false - } - if this.FetchedSeriesCount != that1.FetchedSeriesCount { - return false - } - if this.FetchedChunkBytes != that1.FetchedChunkBytes { - return false - } - return true -} -func (this *Stats) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 7) - s = append(s, "&stats.Stats{") - s = append(s, "WallTime: "+fmt.Sprintf("%#v", this.WallTime)+",\n") - s = append(s, "FetchedSeriesCount: "+fmt.Sprintf("%#v", this.FetchedSeriesCount)+",\n") - s = append(s, "FetchedChunkBytes: "+fmt.Sprintf("%#v", this.FetchedChunkBytes)+",\n") - s = append(s, "}") - return strings.Join(s, "") -} -func valueToGoStringStats(v interface{}, typ string) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("func(v %v) *%v { return &v } ( %#v )", typ, typ, pv) +var fileDescriptor_993e99dbe6209dce = []byte{ + // 288 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0xd0, 0x31, 0x52, 0xb3, 0x40, + 0x14, 0xc0, 0xf1, 0x6f, 0x93, 0xf0, 0x4d, 0xc4, 0x2a, 0x9b, 0x14, 0x98, 0x82, 0x30, 0x56, 0x54, + 0xe0, 0xe8, 0x05, 0x1c, 0x62, 0x69, 0x05, 0x56, 0x36, 0xcc, 0x02, 0x1b, 0xc2, 0x64, 0x61, 0x91, + 0x7d, 0x8c, 0x7a, 0x08, 0x7b, 0x8f, 0x94, 0xd2, 0x13, 0xa8, 0xc3, 0x49, 0x9c, 0xb7, 0x4b, 0x0a, + 0x6d, 0x18, 0x1e, 0x3f, 0xfe, 0xc3, 0x63, 0x6d, 0x2f, 0x97, 0x1d, 0xf0, 0x97, 0xf0, 0xa9, 0xe7, + 0x5d, 0xc5, 0xbb, 0x50, 0x01, 0x03, 0x65, 0xae, 0x41, 0xdb, 0x49, 0x90, 0xd4, 0xd2, 0xc3, 0x7a, + 0x55, 0xca, 0x52, 0xea, 0x27, 0x21, 0xde, 0x19, 0x5c, 0xbb, 0xa5, 0x94, 0xa5, 0xe0, 0xa1, 0x9e, + 0xb2, 0x7e, 0x17, 0x16, 0x7d, 0xc7, 0xa0, 0x92, 0x8d, 0xf1, 0xcb, 0xb7, 0x89, 0x6d, 0x25, 0xd8, + 0xd3, 0x5b, 0xfb, 0xec, 0x99, 0x09, 0x91, 0x42, 0x55, 0x73, 0x87, 0x78, 0xc4, 0x3f, 0xbf, 0xbe, + 0x08, 0x4c, 0x1d, 0x9c, 0xea, 0xe0, 0x6e, 0xac, 0xa3, 0xf9, 0xf1, 0x73, 0xf3, 0xef, 0xfd, 0x6b, + 0x43, 0xe2, 0x39, 0x56, 0x0f, 0x55, 0xcd, 0xe9, 0x95, 0xbd, 0xda, 0x71, 0xc8, 0xf7, 0xbc, 0x48, + 0x15, 0x2e, 0xab, 0xd2, 0x5c, 0xf6, 0x0d, 0x38, 0x13, 0x8f, 0xf8, 0xb3, 0x98, 0x8e, 0x96, 0x68, + 0xda, 0xa2, 0xd0, 0xc0, 0x5e, 0x9e, 0x8a, 0x7c, 0xdf, 0x37, 0x87, 0x34, 0x7b, 0x05, 0xae, 0x9c, + 0xa9, 0x0e, 0x16, 0x23, 0x6d, 0x51, 0x22, 0x04, 0x7c, 0xbf, 0xe5, 0xec, 0x90, 0x0a, 0xc9, 0x0a, + 0xfc, 0x0a, 0xab, 0x5b, 0xc1, 0x95, 0x33, 0xf3, 0x88, 0x6f, 0xc5, 0x0b, 0xa4, 0x7b, 0x2d, 0x89, + 0x01, 0xdc, 0x08, 0x24, 0x30, 0xf1, 0x37, 0xb0, 0x3c, 0xe2, 0x4f, 0x63, 0xaa, 0xed, 0x57, 0x11, + 0x2d, 0x8f, 0x83, 0x4b, 0x3e, 0x06, 0x97, 0x7c, 0x0f, 0x2e, 0x79, 0x34, 0x47, 0x9b, 0xfd, 0xd7, + 0xff, 0x7f, 0xf3, 0x13, 0x00, 0x00, 0xff, 0xff, 0x99, 0x96, 0x18, 0xaf, 0x8c, 0x01, 0x00, 0x00, } + func (m *Stats) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -189,6 +160,20 @@ func (m *Stats) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.TotalLoadedSamples != 0 { + i = encodeVarintStats(dAtA, i, uint64(m.TotalLoadedSamples)) + i-- + dAtA[i] = 0x28 + } + if m.PeakLoadedSamples != 0 { + i = encodeVarintStats(dAtA, i, uint64(m.PeakLoadedSamples)) + i-- + dAtA[i] = 0x20 + } if m.FetchedChunkBytes != 0 { i = encodeVarintStats(dAtA, i, uint64(m.FetchedChunkBytes)) i-- @@ -235,6 +220,15 @@ func (m *Stats) Size() (n int) { if m.FetchedChunkBytes != 0 { n += 1 + sovStats(uint64(m.FetchedChunkBytes)) } + if m.PeakLoadedSamples != 0 { + n += 1 + sovStats(uint64(m.PeakLoadedSamples)) + } + if m.TotalLoadedSamples != 0 { + n += 1 + sovStats(uint64(m.TotalLoadedSamples)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } return n } @@ -244,26 +238,6 @@ func sovStats(x uint64) (n int) { func sozStats(x uint64) (n int) { return sovStats(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (this *Stats) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Stats{`, - `WallTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.WallTime), "Duration", "duration.Duration", 1), `&`, ``, 1) + `,`, - `FetchedSeriesCount:` + fmt.Sprintf("%v", this.FetchedSeriesCount) + `,`, - `FetchedChunkBytes:` + fmt.Sprintf("%v", this.FetchedChunkBytes) + `,`, - `}`, - }, "") - return s -} -func valueToStringStats(v interface{}) string { - rv := reflect.ValueOf(v) - if rv.IsNil() { - return "nil" - } - pv := reflect.Indirect(rv).Interface() - return fmt.Sprintf("*%v", pv) -} func (m *Stats) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -364,21 +338,57 @@ func (m *Stats) Unmarshal(dAtA []byte) error { break } } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PeakLoadedSamples", wireType) + } + m.PeakLoadedSamples = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStats + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PeakLoadedSamples |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalLoadedSamples", wireType) + } + m.TotalLoadedSamples = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStats + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalLoadedSamples |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStats(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { - return ErrInvalidLengthStats - } - if (iNdEx + skippy) < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthStats } if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) iNdEx += skippy } } @@ -391,6 +401,7 @@ func (m *Stats) Unmarshal(dAtA []byte) error { func skipStats(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -422,10 +433,8 @@ func skipStats(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -446,55 +455,30 @@ func skipStats(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthStats } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthStats - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowStats - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := skipStats(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthStats - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupStats + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthStats + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthStats = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowStats = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthStats = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowStats = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupStats = fmt.Errorf("proto: unexpected end of group") ) diff --git a/internal/cortex/querier/stats/stats.proto b/internal/cortex/querier/stats/stats.proto index 6c462169a2..f4fe447c96 100644 --- a/internal/cortex/querier/stats/stats.proto +++ b/internal/cortex/querier/stats/stats.proto @@ -7,7 +7,7 @@ package stats; option go_package = "stats"; -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; +import "gogoproto/gogo.proto"; import "google/protobuf/duration.proto"; option (gogoproto.marshaler_all) = true; @@ -20,4 +20,8 @@ message Stats { uint64 fetched_series_count = 2; // The number of bytes of the chunks fetched for the query uint64 fetched_chunk_bytes = 3; + // The maximum number of samples loaded in a single execution window. + int32 peak_loaded_samples = 4; + // The total number of samples loaded for the query + int64 total_loaded_samples = 5; } diff --git a/mixin/README.md b/mixin/README.md index 53eb23bf48..19e0203872 100644 --- a/mixin/README.md +++ b/mixin/README.md @@ -2,7 +2,7 @@ > Note that everything is experimental and may change significantly at any time. Also it still has missing alert and dashboard definitions for certain components, e.g. rule and sidecar. Please feel free to contribute. -This directory contains extensible and customizable monitoring definitons for Thanos. [Grafana](http://grafana.com/) dashboards, and [Prometheus rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/) combined with documentation and scripts to provide easy monitoring experience for Thanos. +This directory contains extensible and customizable monitoring definitions for Thanos. [Grafana](http://grafana.com/) dashboards, and [Prometheus rules](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/) combined with documentation and scripts to provide easy monitoring experience for Thanos. You can find more about monitoring-mixins in [the design document](https://github.com/monitoring-mixins/docs/blob/master/design.pdf), and you can check out other examples like [Prometheus Mixin](https://github.com/prometheus/prometheus/tree/master/documentation/prometheus-mixin). diff --git a/mixin/alerts/query.libsonnet b/mixin/alerts/query.libsonnet index 80dd85287a..9015ffb582 100644 --- a/mixin/alerts/query.libsonnet +++ b/mixin/alerts/query.libsonnet @@ -145,7 +145,7 @@ { alert: 'ThanosQueryOverload', annotations: { - description: 'Thanos Query {{$labels.job}}%s has been overloaded for more than 15 minutes. This may be a symptom of excessive simultanous complex requests, low performance of the Prometheus API, or failures within these components. Assess the health of the Thanos query instances, the connnected Prometheus instances, look for potential senders of these requests and then contact support.' % location, + description: 'Thanos Query {{$labels.job}}%s has been overloaded for more than 15 minutes. This may be a symptom of excessive simultaneous complex requests, low performance of the Prometheus API, or failures within these components. Assess the health of the Thanos query instances, the connected Prometheus instances, look for potential senders of these requests and then contact support.' % location, summary: 'Thanos query reaches its maximum capacity serving concurrent requests.', }, expr: ||| diff --git a/mixin/dashboards/receive.libsonnet b/mixin/dashboards/receive.libsonnet index 762bb5c35b..33e7c542a2 100644 --- a/mixin/dashboards/receive.libsonnet +++ b/mixin/dashboards/receive.libsonnet @@ -200,7 +200,7 @@ local utils = import '../lib/utils.libsonnet'; ) ) .addPanel( - g.panel('Errors', 'Shows ratio of errors compared to the total number of forwareded requests to other receive nodes.') + + g.panel('Errors', 'Shows ratio of errors compared to the total number of forwarded requests to other receive nodes.') + g.qpsErrTotalPanel( 'thanos_receive_forward_requests_total{%s}' % utils.joinLabels([thanos.receive.dashboard.selector, 'result="error"']), 'thanos_receive_forward_requests_total{%s}' % thanos.receive.dashboard.selector, diff --git a/mixin/runbook.md b/mixin/runbook.md index 48c9a5ada0..38b72eb800 100755 --- a/mixin/runbook.md +++ b/mixin/runbook.md @@ -50,7 +50,7 @@ |ThanosQueryHighDNSFailures|Thanos Query is having high number of DNS failures.|Thanos Query {{$labels.job}} have {{$value humanize}}% of failing DNS queries for store endpoints.|warning|[https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryhighdnsfailures](https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryhighdnsfailures)| |ThanosQueryInstantLatencyHigh|Thanos Query has high latency for queries.|Thanos Query {{$labels.job}} has a 99th percentile latency of {{$value}} seconds for instant queries.|critical|[https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryinstantlatencyhigh](https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryinstantlatencyhigh)| |ThanosQueryRangeLatencyHigh|Thanos Query has high latency for queries.|Thanos Query {{$labels.job}} has a 99th percentile latency of {{$value}} seconds for range queries.|critical|[https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryrangelatencyhigh](https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryrangelatencyhigh)| -|ThanosQueryOverload|Thanos query reaches its maximum capacity serving concurrent requests.|Thanos Query {{$labels.job}} has been overloaded for more than 15 minutes. This may be a symptom of excessive simultanous complex requests, low performance of the Prometheus API, or failures within these components. Assess the health of the Thanos query instances, the connnected Prometheus instances, look for potential senders of these requests and then contact support.|warning|[https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryoverload](https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryoverload)| +|ThanosQueryOverload|Thanos query reaches its maximum capacity serving concurrent requests.|Thanos Query {{$labels.job}} has been overloaded for more than 15 minutes. This may be a symptom of excessive simultaneous complex requests, low performance of the Prometheus API, or failures within these components. Assess the health of the Thanos query instances, the connected Prometheus instances, look for potential senders of these requests and then contact support.|warning|[https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryoverload](https://github.com/thanos-io/thanos/tree/main/mixin/runbook.md#alert-name-thanosqueryoverload)| ## thanos-receive diff --git a/pkg/api/api.go b/pkg/api/api.go index d9dc5f4700..fc2efa1edb 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -20,15 +20,16 @@ package api import ( - "encoding/json" "fmt" "net/http" "os" "runtime" + "runtime/debug" "time" "github.com/go-kit/log" "github.com/go-kit/log/level" + jsoniter "github.com/json-iterator/go" "github.com/klauspost/compress/gzhttp" "github.com/opentracing/opentracing-go" "github.com/prometheus/common/route" @@ -39,6 +40,9 @@ import ( "github.com/thanos-io/thanos/pkg/logging" "github.com/thanos-io/thanos/pkg/server/http/middleware" "github.com/thanos-io/thanos/pkg/tracing" + + // NOTE(GiedriusS): to register jsoniter marshalers. + _ "github.com/prometheus/prometheus/web/api/v1" ) type status string @@ -66,6 +70,11 @@ var corsHeaders = map[string]string{ "Access-Control-Expose-Headers": "Date", } +var ( + // Let suse the same json codec used by upstream prometheus. + json = jsoniter.ConfigCompatibleWithStandardLibrary +) + // ThanosVersion contains build information about Thanos. type ThanosVersion struct { Version string `json:"version"` @@ -102,6 +111,7 @@ type RuntimeInfo struct { GOMAXPROCS int `json:"GOMAXPROCS"` GOGC string `json:"GOGC"` GODEBUG string `json:"GODEBUG"` + GOMEMLIMIT int64 `json:"GOMEMLIMIT"` } // RuntimeInfoFn returns updated runtime information about Thanos. @@ -190,6 +200,7 @@ func GetRuntimeInfoFunc(logger log.Logger) RuntimeInfoFn { GOMAXPROCS: runtime.GOMAXPROCS(0), GOGC: os.Getenv("GOGC"), GODEBUG: os.Getenv("GODEBUG"), + GOMEMLIMIT: debug.SetMemoryLimit(-1), } } } @@ -210,10 +221,10 @@ func GetInstr( SetCORS(w) } if data, warnings, err, releaseResources := f(r); err != nil { - RespondError(w, err, data) + RespondError(w, err, data, logger) releaseResources() } else if data != nil { - Respond(w, data, warnings) + Respond(w, data, warnings, logger) releaseResources() } else { w.WriteHeader(http.StatusNoContent) @@ -221,10 +232,10 @@ func GetInstr( } }) - return tracing.HTTPMiddleware(tracer, name, logger, - ins.NewHandler(name, - gzhttp.GzipHandler( - middleware.RequestID( + return middleware.RequestID( + tracing.HTTPMiddleware(tracer, name, logger, + ins.NewHandler(name, + gzhttp.GzipHandler( logMiddleware.HTTPMiddleware(name, hf), ), ), @@ -244,7 +255,7 @@ func shouldNotCacheBecauseOfWarnings(warnings []error) bool { return false } -func Respond(w http.ResponseWriter, data interface{}, warnings []error) { +func Respond(w http.ResponseWriter, data interface{}, warnings []error, logger log.Logger) { w.Header().Set("Content-Type", "application/json") if shouldNotCacheBecauseOfWarnings(warnings) { w.Header().Set("Cache-Control", "no-store") @@ -258,10 +269,21 @@ func Respond(w http.ResponseWriter, data interface{}, warnings []error) { for _, warn := range warnings { resp.Warnings = append(resp.Warnings, warn.Error()) } - _ = json.NewEncoder(w).Encode(resp) + + json := jsoniter.ConfigCompatibleWithStandardLibrary + b, err := json.Marshal(resp) + if err != nil { + level.Error(logger).Log("msg", "error marshaling response", "err", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if n, err := w.Write(b); err != nil { + level.Error(logger).Log("msg", "error writing response", "bytesWritten", n, "err", err) + } } -func RespondError(w http.ResponseWriter, apiErr *ApiError, data interface{}) { +func RespondError(w http.ResponseWriter, apiErr *ApiError, data interface{}, logger log.Logger) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Cache-Control", "no-store") @@ -280,10 +302,20 @@ func RespondError(w http.ResponseWriter, apiErr *ApiError, data interface{}) { } w.WriteHeader(code) - _ = json.NewEncoder(w).Encode(&response{ + json := jsoniter.ConfigCompatibleWithStandardLibrary + b, err := json.Marshal(&response{ Status: StatusError, ErrorType: apiErr.Typ, Error: apiErr.Err.Error(), Data: data, }) + if err != nil { + level.Error(logger).Log("msg", "error marshaling response", "err", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if n, err := w.Write(b); err != nil { + level.Error(logger).Log("msg", "error writing response", "bytesWritten", n, "err", err) + } } diff --git a/pkg/api/api_test.go b/pkg/api/api_test.go index 88c9a30772..cc5c58a00a 100644 --- a/pkg/api/api_test.go +++ b/pkg/api/api_test.go @@ -17,7 +17,6 @@ package api import ( - "encoding/json" "io" "net/http" "net/http/httptest" @@ -28,15 +27,52 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pkg/errors" "github.com/prometheus/common/route" + promLabels "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/promql" + "github.com/prometheus/prometheus/promql/parser" + promApiV1 "github.com/prometheus/prometheus/web/api/v1" "github.com/efficientgo/core/testutil" extpromhttp "github.com/thanos-io/thanos/pkg/extprom/http" "github.com/thanos-io/thanos/pkg/logging" ) +func TestMarshallMatrixNull(t *testing.T) { + var m promql.Matrix + result := response{ + Status: StatusSuccess, + Data: promApiV1.QueryData{ + ResultType: parser.ValueTypeMatrix, + Result: m, // null + }, + } + + b1, err := json.Marshal(result) + if err != nil { + t.Fatalf("Error marshaling response body: %s", err) + } + + exp := response{ + Status: StatusSuccess, + Data: promApiV1.QueryData{ + ResultType: parser.ValueTypeMatrix, + Result: promql.Matrix{}, + }, + } + + b2, err := json.Marshal(exp) + if err != nil { + t.Fatalf("Error marshaling response body: %s", err) + } + + if !reflect.DeepEqual(b1, b2) { + t.Fatalf("Expected response \n%v\n but got \n%v\n", string(b1), string(b2)) + } +} + func TestRespondSuccess(t *testing.T) { s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - Respond(w, "test", nil) + Respond(w, "test", nil, log.NewNopLogger()) })) defer s.Close() @@ -73,7 +109,7 @@ func TestRespondSuccess(t *testing.T) { func TestRespondError(t *testing.T) { s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - RespondError(w, &ApiError{ErrorTimeout, errors.New("message")}, "test") + RespondError(w, &ApiError{ErrorTimeout, errors.New("message")}, "test", log.NewNopLogger()) })) defer s.Close() @@ -139,3 +175,35 @@ func TestOptionsMethod(t *testing.T) { } } } + +type nilWriter struct{} + +var _ = http.ResponseWriter(&nilWriter{}) + +func (nilWriter) Write(p []byte) (n int, err error) { + return 0, nil +} + +func (nilWriter) Header() http.Header { + return http.Header{} +} + +func (nilWriter) WriteHeader(statusCode int) {} + +func BenchmarkRespond(b *testing.B) { + floats := []promql.FPoint{} + + for i := 0; i < 10000; i++ { + floats = append(floats, promql.FPoint{T: 1435781451 + int64(i), F: 1234.123 + float64(i)}) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + Respond(&nilWriter{}, promql.Matrix{ + promql.Series{ + Metric: promLabels.FromMap(map[string]string{"__name__": "up", "job": "prometheus"}), + Floats: floats, + }, + }, nil, log.NewNopLogger()) + } +} diff --git a/pkg/api/blocks/v1_test.go b/pkg/api/blocks/v1_test.go index 0899c3e5bb..49e7ef0681 100644 --- a/pkg/api/blocks/v1_test.go +++ b/pkg/api/blocks/v1_test.go @@ -99,12 +99,12 @@ func TestMarkBlockEndpoint(t *testing.T) { // create block b1, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - {{Name: "a", Value: "3"}}, - {{Name: "a", Value: "4"}}, - {{Name: "b", Value: "1"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "val1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + labels.FromStrings("a", "3"), + labels.FromStrings("a", "4"), + labels.FromStrings("b", "1"), + }, 100, 0, 1000, labels.FromStrings("ext1", "val1"), 124, metadata.NoneFunc) testutil.Ok(t, err) // upload block diff --git a/pkg/api/query/grpc.go b/pkg/api/query/grpc.go index e471001db2..093457dd06 100644 --- a/pkg/api/query/grpc.go +++ b/pkg/api/query/grpc.go @@ -9,6 +9,7 @@ import ( "github.com/prometheus/prometheus/promql" "github.com/prometheus/prometheus/storage" + "github.com/thanos-io/promql-engine/engine" "github.com/thanos-io/promql-engine/logicalplan" "google.golang.org/grpc" "google.golang.org/grpc/codes" @@ -18,6 +19,7 @@ import ( "github.com/thanos-io/thanos/pkg/query" "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb/prompb" + "github.com/thanos-io/thanos/pkg/tracing" ) type GRPCAPI struct { @@ -92,13 +94,20 @@ func (g *GRPCAPI) Query(request *querypb.QueryRequest, server querypb.Query_Quer query.NoopSeriesStatsReporter, ) - qry, err := g.getQueryForEngine(ctx, request, queryable, maxResolution) - if err != nil { + var qry promql.Query + if err := tracing.DoInSpanWithErr(ctx, "instant_query_create", func(ctx context.Context) error { + var err error + qry, err = g.getQueryForEngine(ctx, request, queryable, maxResolution) + return err + }); err != nil { return err } defer qry.Close() - result := qry.Exec(ctx) + var result *promql.Result + tracing.DoInSpan(ctx, "range_query_exec", func(ctx context.Context) { + result = qry.Exec(ctx) + }) if result.Err != nil { return status.Error(codes.Aborted, result.Err.Error()) } @@ -129,7 +138,9 @@ func (g *GRPCAPI) Query(request *querypb.QueryRequest, server querypb.Query_Quer return err } } - return nil + } + if err := server.Send(querypb.NewQueryStatsResponse(extractQueryStats(qry))); err != nil { + return err } return nil @@ -203,13 +214,20 @@ func (g *GRPCAPI) QueryRange(request *querypb.QueryRangeRequest, srv querypb.Que query.NoopSeriesStatsReporter, ) - qry, err := g.getRangeQueryForEngine(ctx, request, queryable) - if err != nil { + var qry promql.Query + if err := tracing.DoInSpanWithErr(ctx, "range_query_create", func(ctx context.Context) error { + var err error + qry, err = g.getRangeQueryForEngine(ctx, request, queryable) + return err + }); err != nil { return err } defer qry.Close() - result := qry.Exec(ctx) + var result *promql.Result + tracing.DoInSpan(ctx, "range_query_exec", func(ctx context.Context) { + result = qry.Exec(ctx) + }) if result.Err != nil { return status.Error(codes.Aborted, result.Err.Error()) } @@ -245,17 +263,35 @@ func (g *GRPCAPI) QueryRange(request *querypb.QueryRangeRequest, srv querypb.Que return err } } - return nil case promql.Scalar: series := &prompb.TimeSeries{ Samples: []prompb.Sample{{Value: value.V, Timestamp: value.T}}, } - return srv.Send(querypb.NewQueryRangeResponse(series)) + if err := srv.Send(querypb.NewQueryRangeResponse(series)); err != nil { + return err + } + } + if err := srv.Send(querypb.NewQueryRangeStatsResponse(extractQueryStats(qry))); err != nil { + return err } return nil } +func extractQueryStats(qry promql.Query) *querypb.QueryStats { + stats := &querypb.QueryStats{ + SamplesTotal: 0, + PeakSamples: 0, + } + if explQry, ok := qry.(engine.ExplainableQuery); ok { + analyze := explQry.Analyze() + stats.SamplesTotal = analyze.TotalSamples() + stats.PeakSamples = analyze.PeakSamples() + } + + return stats +} + func (g *GRPCAPI) getRangeQueryForEngine( ctx context.Context, request *querypb.QueryRangeRequest, diff --git a/pkg/api/query/grpc_test.go b/pkg/api/query/grpc_test.go index 4885126c46..f1be2a5489 100644 --- a/pkg/api/query/grpc_test.go +++ b/pkg/api/query/grpc_test.go @@ -13,7 +13,6 @@ import ( "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/prometheus/promql" - "github.com/prometheus/prometheus/promql/parser" "github.com/prometheus/prometheus/storage" "github.com/prometheus/prometheus/util/annotations" "github.com/thanos-io/promql-engine/logicalplan" @@ -21,6 +20,7 @@ import ( "github.com/thanos-io/thanos/pkg/api/query/querypb" "github.com/thanos-io/thanos/pkg/component" + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/query" "github.com/thanos-io/thanos/pkg/store" ) @@ -36,7 +36,7 @@ func TestGRPCQueryAPIWithQueryPlan(t *testing.T) { } api := NewGRPCAPI(time.Now, nil, queryableCreator, engineFactory, querypb.EngineType_thanos, lookbackDeltaFunc, 0) - expr, err := parser.ParseExpr("metric") + expr, err := extpromql.ParseExpr("metric") testutil.Ok(t, err) lplan := logicalplan.NewFromAST(expr, &equery.Options{}, logicalplan.PlanOptions{}) testutil.Ok(t, err) @@ -117,7 +117,9 @@ func TestGRPCQueryAPIErrorHandling(t *testing.T) { if len(test.engine.warns) > 0 { testutil.Ok(t, err) for i, resp := range srv.responses { - testutil.Equals(t, test.engine.warns.AsErrors()[i].Error(), resp.GetWarnings()) + if resp.GetWarnings() != "" { + testutil.Equals(t, test.engine.warns.AsErrors()[i].Error(), resp.GetWarnings()) + } } } }) @@ -136,7 +138,9 @@ func TestGRPCQueryAPIErrorHandling(t *testing.T) { if len(test.engine.warns) > 0 { testutil.Ok(t, err) for i, resp := range srv.responses { - testutil.Equals(t, test.engine.warns.AsErrors()[i].Error(), resp.GetWarnings()) + if resp.GetWarnings() != "" { + testutil.Equals(t, test.engine.warns.AsErrors()[i].Error(), resp.GetWarnings()) + } } } }) diff --git a/pkg/api/query/querypb/query.pb.go b/pkg/api/query/querypb/query.pb.go index ca70d93e5e..9ec2460a8a 100644 --- a/pkg/api/query/querypb/query.pb.go +++ b/pkg/api/query/querypb/query.pb.go @@ -58,6 +58,44 @@ func (EngineType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_4b2aba43925d729f, []int{0} } +type QueryStats struct { + SamplesTotal int64 `protobuf:"varint,1,opt,name=samples_total,json=samplesTotal,proto3" json:"samples_total,omitempty"` + PeakSamples int64 `protobuf:"varint,2,opt,name=peak_samples,json=peakSamples,proto3" json:"peak_samples,omitempty"` +} + +func (m *QueryStats) Reset() { *m = QueryStats{} } +func (m *QueryStats) String() string { return proto.CompactTextString(m) } +func (*QueryStats) ProtoMessage() {} +func (*QueryStats) Descriptor() ([]byte, []int) { + return fileDescriptor_4b2aba43925d729f, []int{0} +} +func (m *QueryStats) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryStats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryStats.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryStats) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryStats.Merge(m, src) +} +func (m *QueryStats) XXX_Size() int { + return m.Size() +} +func (m *QueryStats) XXX_DiscardUnknown() { + xxx_messageInfo_QueryStats.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryStats proto.InternalMessageInfo + type QueryRequest struct { Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` QueryPlan *QueryPlan `protobuf:"bytes,14,opt,name=queryPlan,proto3" json:"queryPlan,omitempty"` @@ -78,7 +116,7 @@ func (m *QueryRequest) Reset() { *m = QueryRequest{} } func (m *QueryRequest) String() string { return proto.CompactTextString(m) } func (*QueryRequest) ProtoMessage() {} func (*QueryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_4b2aba43925d729f, []int{0} + return fileDescriptor_4b2aba43925d729f, []int{1} } func (m *QueryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -115,7 +153,7 @@ func (m *StoreMatchers) Reset() { *m = StoreMatchers{} } func (m *StoreMatchers) String() string { return proto.CompactTextString(m) } func (*StoreMatchers) ProtoMessage() {} func (*StoreMatchers) Descriptor() ([]byte, []int) { - return fileDescriptor_4b2aba43925d729f, []int{1} + return fileDescriptor_4b2aba43925d729f, []int{2} } func (m *StoreMatchers) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -148,6 +186,7 @@ type QueryResponse struct { // Types that are valid to be assigned to Result: // *QueryResponse_Warnings // *QueryResponse_Timeseries + // *QueryResponse_Stats Result isQueryResponse_Result `protobuf_oneof:"result"` } @@ -155,7 +194,7 @@ func (m *QueryResponse) Reset() { *m = QueryResponse{} } func (m *QueryResponse) String() string { return proto.CompactTextString(m) } func (*QueryResponse) ProtoMessage() {} func (*QueryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4b2aba43925d729f, []int{2} + return fileDescriptor_4b2aba43925d729f, []int{3} } func (m *QueryResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -196,9 +235,13 @@ type QueryResponse_Warnings struct { type QueryResponse_Timeseries struct { Timeseries *prompb.TimeSeries `protobuf:"bytes,2,opt,name=timeseries,proto3,oneof" json:"timeseries,omitempty"` } +type QueryResponse_Stats struct { + Stats *QueryStats `protobuf:"bytes,3,opt,name=stats,proto3,oneof" json:"stats,omitempty"` +} func (*QueryResponse_Warnings) isQueryResponse_Result() {} func (*QueryResponse_Timeseries) isQueryResponse_Result() {} +func (*QueryResponse_Stats) isQueryResponse_Result() {} func (m *QueryResponse) GetResult() isQueryResponse_Result { if m != nil { @@ -221,11 +264,91 @@ func (m *QueryResponse) GetTimeseries() *prompb.TimeSeries { return nil } +func (m *QueryResponse) GetStats() *QueryStats { + if x, ok := m.GetResult().(*QueryResponse_Stats); ok { + return x.Stats + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*QueryResponse) XXX_OneofWrappers() []interface{} { return []interface{}{ (*QueryResponse_Warnings)(nil), (*QueryResponse_Timeseries)(nil), + (*QueryResponse_Stats)(nil), + } +} + +type QueryPlan struct { + // Types that are valid to be assigned to Encoding: + // *QueryPlan_Json + Encoding isQueryPlan_Encoding `protobuf_oneof:"encoding"` +} + +func (m *QueryPlan) Reset() { *m = QueryPlan{} } +func (m *QueryPlan) String() string { return proto.CompactTextString(m) } +func (*QueryPlan) ProtoMessage() {} +func (*QueryPlan) Descriptor() ([]byte, []int) { + return fileDescriptor_4b2aba43925d729f, []int{4} +} +func (m *QueryPlan) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPlan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPlan.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryPlan) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPlan.Merge(m, src) +} +func (m *QueryPlan) XXX_Size() int { + return m.Size() +} +func (m *QueryPlan) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPlan.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPlan proto.InternalMessageInfo + +type isQueryPlan_Encoding interface { + isQueryPlan_Encoding() + MarshalTo([]byte) (int, error) + Size() int +} + +type QueryPlan_Json struct { + Json []byte `protobuf:"bytes,1,opt,name=json,proto3,oneof" json:"json,omitempty"` +} + +func (*QueryPlan_Json) isQueryPlan_Encoding() {} + +func (m *QueryPlan) GetEncoding() isQueryPlan_Encoding { + if m != nil { + return m.Encoding + } + return nil +} + +func (m *QueryPlan) GetJson() []byte { + if x, ok := m.GetEncoding().(*QueryPlan_Json); ok { + return x.Json + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*QueryPlan) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*QueryPlan_Json)(nil), } } @@ -323,7 +446,7 @@ func (m *QueryRangeRequest) Reset() { *m = QueryRangeRequest{} } func (m *QueryRangeRequest) String() string { return proto.CompactTextString(m) } func (*QueryRangeRequest) ProtoMessage() {} func (*QueryRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_4b2aba43925d729f, []int{4} + return fileDescriptor_4b2aba43925d729f, []int{5} } func (m *QueryRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -356,6 +479,7 @@ type QueryRangeResponse struct { // Types that are valid to be assigned to Result: // *QueryRangeResponse_Warnings // *QueryRangeResponse_Timeseries + // *QueryRangeResponse_Stats Result isQueryRangeResponse_Result `protobuf_oneof:"result"` } @@ -363,7 +487,7 @@ func (m *QueryRangeResponse) Reset() { *m = QueryRangeResponse{} } func (m *QueryRangeResponse) String() string { return proto.CompactTextString(m) } func (*QueryRangeResponse) ProtoMessage() {} func (*QueryRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_4b2aba43925d729f, []int{5} + return fileDescriptor_4b2aba43925d729f, []int{6} } func (m *QueryRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -404,9 +528,13 @@ type QueryRangeResponse_Warnings struct { type QueryRangeResponse_Timeseries struct { Timeseries *prompb.TimeSeries `protobuf:"bytes,2,opt,name=timeseries,proto3,oneof" json:"timeseries,omitempty"` } +type QueryRangeResponse_Stats struct { + Stats *QueryStats `protobuf:"bytes,3,opt,name=stats,proto3,oneof" json:"stats,omitempty"` +} func (*QueryRangeResponse_Warnings) isQueryRangeResponse_Result() {} func (*QueryRangeResponse_Timeseries) isQueryRangeResponse_Result() {} +func (*QueryRangeResponse_Stats) isQueryRangeResponse_Result() {} func (m *QueryRangeResponse) GetResult() isQueryRangeResponse_Result { if m != nil { @@ -429,16 +557,25 @@ func (m *QueryRangeResponse) GetTimeseries() *prompb.TimeSeries { return nil } +func (m *QueryRangeResponse) GetStats() *QueryStats { + if x, ok := m.GetResult().(*QueryRangeResponse_Stats); ok { + return x.Stats + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*QueryRangeResponse) XXX_OneofWrappers() []interface{} { return []interface{}{ (*QueryRangeResponse_Warnings)(nil), (*QueryRangeResponse_Timeseries)(nil), + (*QueryRangeResponse_Stats)(nil), } } func init() { proto.RegisterEnum("thanos.EngineType", EngineType_name, EngineType_value) + proto.RegisterType((*QueryStats)(nil), "thanos.QueryStats") proto.RegisterType((*QueryRequest)(nil), "thanos.QueryRequest") proto.RegisterType((*StoreMatchers)(nil), "thanos.StoreMatchers") proto.RegisterType((*QueryResponse)(nil), "thanos.QueryResponse") @@ -450,56 +587,60 @@ func init() { func init() { proto.RegisterFile("api/query/querypb/query.proto", fileDescriptor_4b2aba43925d729f) } var fileDescriptor_4b2aba43925d729f = []byte{ - // 784 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0x4f, 0x6f, 0xe3, 0x44, - 0x1c, 0xb5, 0x37, 0xff, 0x7f, 0x4e, 0x52, 0xef, 0x28, 0x05, 0x6f, 0x00, 0x63, 0x22, 0xad, 0x30, - 0x2b, 0x48, 0x56, 0x61, 0xe1, 0x86, 0x04, 0x61, 0x57, 0x2a, 0x68, 0x91, 0xb6, 0x6e, 0x4f, 0x5c, - 0xa2, 0x49, 0x3c, 0x4d, 0x4c, 0x9c, 0x19, 0xd7, 0x33, 0x2e, 0x8d, 0xb8, 0x73, 0xe6, 0xe3, 0xf0, - 0x11, 0x7a, 0xac, 0xc4, 0x85, 0x13, 0x82, 0xf6, 0x8b, 0x20, 0x8f, 0xff, 0xc4, 0xae, 0x2a, 0x48, - 0x54, 0x69, 0x2f, 0xce, 0xcc, 0x7b, 0x6f, 0xc6, 0xbf, 0x79, 0xfe, 0xbd, 0x0c, 0x7c, 0x80, 0x03, - 0x6f, 0x74, 0x1e, 0x91, 0x70, 0x93, 0x3c, 0x83, 0x59, 0xf2, 0x3b, 0x0c, 0x42, 0x26, 0x18, 0xaa, - 0x8b, 0x25, 0xa6, 0x8c, 0xf7, 0x7b, 0x0b, 0xb6, 0x60, 0x12, 0x1a, 0xc5, 0xa3, 0x84, 0xed, 0x3f, - 0xe1, 0x82, 0x85, 0x64, 0x24, 0x9f, 0xc1, 0x6c, 0x24, 0x36, 0x01, 0xe1, 0x29, 0xf5, 0x6e, 0x99, - 0x0a, 0x83, 0x79, 0x4a, 0x58, 0x65, 0x22, 0x08, 0xd9, 0xba, 0xbc, 0x74, 0xf0, 0x47, 0x15, 0xda, - 0xc7, 0x71, 0x0d, 0x0e, 0x39, 0x8f, 0x08, 0x17, 0xa8, 0x07, 0x35, 0x59, 0x93, 0xa1, 0x5a, 0xaa, - 0xdd, 0x72, 0x92, 0x09, 0x1a, 0x41, 0x4b, 0x0e, 0xde, 0xf8, 0x98, 0x1a, 0x5d, 0x4b, 0xb5, 0xb5, - 0xf1, 0xe3, 0x61, 0x52, 0xee, 0x30, 0x27, 0x9c, 0xad, 0x06, 0x7d, 0x04, 0x6d, 0xe1, 0xad, 0xc9, - 0x94, 0x93, 0x39, 0xa3, 0x2e, 0x37, 0x1e, 0x59, 0xaa, 0x5d, 0x71, 0xb4, 0x18, 0x3b, 0x49, 0x20, - 0xf4, 0x31, 0x1c, 0xc4, 0x53, 0x16, 0x89, 0x5c, 0x55, 0x91, 0xaa, 0x6e, 0x0a, 0x67, 0xc2, 0x17, - 0xf0, 0xce, 0x1a, 0x5f, 0x4e, 0x43, 0xc2, 0x99, 0x1f, 0x09, 0x8f, 0xd1, 0x5c, 0x5f, 0x95, 0xfa, - 0xde, 0x1a, 0x5f, 0x3a, 0x39, 0x99, 0xad, 0x7a, 0x0a, 0xdd, 0x90, 0x04, 0xbe, 0x37, 0xc7, 0x53, - 0x1f, 0xcf, 0x88, 0xcf, 0x8d, 0x9a, 0x55, 0xb1, 0x5b, 0x4e, 0x27, 0x45, 0x5f, 0x4b, 0x10, 0x7d, - 0x03, 0x1d, 0x69, 0xcf, 0x0f, 0x58, 0xcc, 0x97, 0x24, 0xe4, 0x46, 0xdd, 0xaa, 0xd8, 0xda, 0xf8, - 0x30, 0x3b, 0xdd, 0x49, 0x91, 0x9c, 0x54, 0xaf, 0xfe, 0xfa, 0x50, 0x71, 0xca, 0x2b, 0x90, 0x05, - 0x1a, 0xa1, 0x78, 0xe6, 0x93, 0x97, 0xc4, 0x8d, 0x02, 0xa3, 0x61, 0xa9, 0x76, 0xd3, 0x29, 0x42, - 0xe8, 0x05, 0x1c, 0x26, 0xd3, 0x37, 0x38, 0x14, 0x1e, 0xf6, 0x1d, 0xc2, 0x03, 0x46, 0x39, 0x31, - 0x9a, 0x52, 0x7b, 0x3f, 0x89, 0x4c, 0x00, 0xbe, 0xf2, 0x82, 0x6f, 0x97, 0x11, 0x5d, 0x71, 0x03, - 0xa4, 0xb4, 0x80, 0xa0, 0xe7, 0x00, 0x7c, 0x89, 0x43, 0x77, 0xea, 0xd1, 0x33, 0x66, 0x68, 0xe5, - 0xaf, 0x72, 0x12, 0x33, 0xdf, 0xd1, 0x33, 0xe6, 0xb4, 0x78, 0x36, 0x8c, 0x9d, 0xf4, 0x19, 0x5b, - 0xcd, 0xf0, 0x7c, 0x35, 0x75, 0x89, 0x2f, 0x70, 0xee, 0x64, 0x3b, 0x71, 0x32, 0x63, 0x5f, 0xc6, - 0x64, 0xe6, 0xe4, 0x33, 0xa8, 0x13, 0xba, 0xf0, 0x28, 0x31, 0x3a, 0x96, 0x6a, 0x77, 0xc7, 0x28, - 0x7b, 0xc7, 0x2b, 0x89, 0x9e, 0x6e, 0x02, 0xe2, 0xa4, 0x8a, 0xef, 0xab, 0xcd, 0x96, 0x0e, 0x83, - 0x63, 0xe8, 0x94, 0x7c, 0x43, 0x5f, 0x43, 0x47, 0x7e, 0x84, 0xdc, 0x65, 0x55, 0xba, 0xdc, 0xcb, - 0x76, 0x7a, 0x5d, 0x20, 0x33, 0x93, 0x4b, 0x0b, 0x06, 0x17, 0xd0, 0x49, 0xfb, 0x34, 0x75, 0xe7, - 0x7d, 0x68, 0xfe, 0x8c, 0x43, 0xea, 0xd1, 0x05, 0x4f, 0x7a, 0xf5, 0x48, 0x71, 0x72, 0x04, 0x7d, - 0x05, 0x10, 0x77, 0x11, 0x27, 0xa1, 0x47, 0x92, 0xee, 0xd3, 0xc6, 0xef, 0xc5, 0x3d, 0xbf, 0x26, - 0x62, 0x49, 0x22, 0x3e, 0x9d, 0xb3, 0x60, 0x33, 0x3c, 0x95, 0xed, 0x18, 0x4b, 0x8e, 0x14, 0xa7, - 0xb0, 0x60, 0xd2, 0x84, 0x7a, 0x48, 0x78, 0xe4, 0x8b, 0xc1, 0x67, 0x85, 0xce, 0x47, 0x3d, 0xa8, - 0xfe, 0xc4, 0x19, 0x95, 0xef, 0x6b, 0x1f, 0x29, 0x8e, 0x9c, 0x4d, 0x00, 0x9a, 0x84, 0xce, 0x99, - 0xeb, 0xd1, 0xc5, 0xe0, 0xf7, 0x1a, 0x3c, 0x4e, 0xea, 0xc4, 0x74, 0x41, 0xf6, 0x08, 0x95, 0xbe, - 0x43, 0xa8, 0x3e, 0x05, 0xc4, 0x05, 0x0e, 0xc5, 0xf4, 0x9e, 0x68, 0xe9, 0x92, 0x39, 0x2d, 0xe4, - 0xcb, 0x06, 0x9d, 0x50, 0xb7, 0xac, 0x4d, 0x03, 0x46, 0xa8, 0x5b, 0x54, 0x7e, 0x02, 0xba, 0x47, - 0x05, 0x09, 0x2f, 0xb0, 0x7f, 0x27, 0x5a, 0x07, 0x19, 0xfe, 0x1f, 0xa1, 0xad, 0xed, 0x19, 0xda, - 0xfa, 0x5e, 0xa1, 0x6d, 0xec, 0x14, 0xda, 0xe6, 0x43, 0x43, 0xdb, 0xda, 0x23, 0xb4, 0xb0, 0x7b, - 0x68, 0xdb, 0xff, 0x13, 0xda, 0xce, 0x83, 0x42, 0xdb, 0xdd, 0x29, 0xb4, 0x07, 0x3b, 0x84, 0x56, - 0xd3, 0xdb, 0x83, 0x5f, 0x00, 0x15, 0x3b, 0xf7, 0xad, 0xc6, 0xec, 0xd9, 0x17, 0x00, 0xdb, 0xc2, - 0x90, 0x06, 0x0d, 0x97, 0x9c, 0xe1, 0xc8, 0x17, 0xba, 0x82, 0xba, 0x00, 0xdb, 0x0d, 0x75, 0x15, - 0x01, 0xa4, 0x17, 0xa5, 0xfe, 0x68, 0xfc, 0xab, 0x0a, 0x35, 0x59, 0x34, 0xfa, 0x32, 0x1b, 0xe4, - 0xff, 0x29, 0xc5, 0x6b, 0xad, 0x7f, 0x78, 0x07, 0x4d, 0x4e, 0xf7, 0x5c, 0x45, 0xaf, 0x00, 0xb6, - 0xa7, 0x46, 0x4f, 0xca, 0xb2, 0x42, 0x86, 0xfb, 0xfd, 0xfb, 0xa8, 0x6c, 0x9b, 0xc9, 0xd3, 0xab, - 0x7f, 0x4c, 0xe5, 0xea, 0xc6, 0x54, 0xaf, 0x6f, 0x4c, 0xf5, 0xef, 0x1b, 0x53, 0xfd, 0xed, 0xd6, - 0x54, 0xae, 0x6f, 0x4d, 0xe5, 0xcf, 0x5b, 0x53, 0xf9, 0xb1, 0x91, 0x5e, 0xf7, 0xb3, 0xba, 0xbc, - 0x75, 0x3f, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x9d, 0x9d, 0xab, 0x0a, 0x08, 0x00, 0x00, + // 848 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xcf, 0x8e, 0xdb, 0x44, + 0x1c, 0xb6, 0xbb, 0x49, 0x36, 0xf9, 0x39, 0xc9, 0xba, 0xa3, 0x2c, 0xb8, 0x01, 0x82, 0x09, 0xaa, + 0x08, 0x2b, 0xd8, 0x54, 0xa1, 0x70, 0x43, 0x82, 0xa5, 0x95, 0x16, 0x54, 0xa4, 0xd6, 0xc9, 0x89, + 0x8b, 0x35, 0x89, 0x7f, 0x9b, 0x98, 0x38, 0x33, 0xae, 0x67, 0x0c, 0xdd, 0x17, 0xe0, 0xcc, 0x33, + 0x70, 0xe1, 0x15, 0x78, 0x84, 0x3d, 0x56, 0xe2, 0xc2, 0x09, 0xc1, 0xee, 0x8b, 0x20, 0x8f, 0xff, + 0xc4, 0xae, 0x56, 0x90, 0xa8, 0x17, 0x2e, 0xf6, 0xcc, 0xf7, 0x7d, 0x33, 0xe3, 0xdf, 0xe7, 0xdf, + 0x27, 0x1b, 0xde, 0xa1, 0xa1, 0x3f, 0x7e, 0x1e, 0x63, 0x74, 0x99, 0x5e, 0xc3, 0x79, 0x7a, 0x3f, + 0x0d, 0x23, 0x2e, 0x39, 0x69, 0xc8, 0x15, 0x65, 0x5c, 0xf4, 0x7b, 0x4b, 0xbe, 0xe4, 0x0a, 0x1a, + 0x27, 0xa3, 0x94, 0xed, 0xdf, 0x13, 0x92, 0x47, 0x38, 0x56, 0xd7, 0x70, 0x3e, 0x96, 0x97, 0x21, + 0x8a, 0x8c, 0x7a, 0xb3, 0x4a, 0x45, 0xe1, 0x22, 0x23, 0xec, 0x2a, 0x11, 0x46, 0x7c, 0x53, 0x5d, + 0x3a, 0x9c, 0x01, 0x3c, 0x4b, 0x1e, 0x61, 0x2a, 0xa9, 0x14, 0xe4, 0x7d, 0xe8, 0x08, 0xba, 0x09, + 0x03, 0x14, 0xae, 0xe4, 0x92, 0x06, 0x96, 0x6e, 0xeb, 0xa3, 0x03, 0xa7, 0x9d, 0x81, 0xb3, 0x04, + 0x23, 0xef, 0x41, 0x3b, 0x44, 0xba, 0x76, 0x33, 0xd0, 0xba, 0xa3, 0x34, 0x46, 0x82, 0x4d, 0x53, + 0x68, 0xf8, 0x7b, 0x0d, 0xda, 0x6a, 0x5b, 0x07, 0x9f, 0xc7, 0x28, 0x24, 0xe9, 0x41, 0x5d, 0x55, + 0xaa, 0x36, 0x6c, 0x39, 0xe9, 0x84, 0x8c, 0xa1, 0xa5, 0x06, 0x4f, 0x03, 0xca, 0xac, 0xae, 0xad, + 0x8f, 0x8c, 0xc9, 0xdd, 0xd3, 0xd4, 0x84, 0xd3, 0x82, 0x70, 0xb6, 0x9a, 0xe4, 0x68, 0xe9, 0x6f, + 0xd0, 0x15, 0xb8, 0xe0, 0xcc, 0x2b, 0x8e, 0x4e, 0xb0, 0x69, 0x0a, 0x91, 0x0f, 0xe0, 0x28, 0x99, + 0xf2, 0x58, 0x16, 0xaa, 0x03, 0xa5, 0xea, 0x66, 0x70, 0x2e, 0x7c, 0x08, 0x6f, 0x6c, 0xe8, 0x0b, + 0x37, 0x42, 0xc1, 0x83, 0x58, 0xfa, 0x9c, 0x15, 0xfa, 0x9a, 0xd2, 0xf7, 0x36, 0xf4, 0x85, 0x53, + 0x90, 0xf9, 0xaa, 0xfb, 0xd0, 0x8d, 0x30, 0x0c, 0xfc, 0x05, 0x75, 0x03, 0x3a, 0xc7, 0x40, 0x58, + 0x75, 0xfb, 0x60, 0xd4, 0x72, 0x3a, 0x19, 0xfa, 0x44, 0x81, 0xe4, 0x4b, 0xe8, 0x28, 0xd3, 0xbf, + 0xa5, 0x72, 0xb1, 0xc2, 0x48, 0x58, 0x0d, 0xfb, 0x60, 0x64, 0x4c, 0x8e, 0xf3, 0xea, 0xa6, 0x65, + 0xf2, 0xac, 0x76, 0xf5, 0xe7, 0xbb, 0x9a, 0x53, 0x5d, 0x41, 0x6c, 0x30, 0x90, 0xd1, 0x79, 0x80, + 0x8f, 0xd0, 0x8b, 0x43, 0xeb, 0xd0, 0xd6, 0x47, 0x4d, 0xa7, 0x0c, 0x91, 0x87, 0x70, 0x9c, 0x4e, + 0x9f, 0xd2, 0x48, 0xfa, 0x34, 0x70, 0x50, 0x84, 0x9c, 0x09, 0xb4, 0x9a, 0x4a, 0x7b, 0x3b, 0x49, + 0x06, 0x00, 0x62, 0xed, 0x87, 0x5f, 0xad, 0x62, 0xb6, 0x16, 0x16, 0x28, 0x69, 0x09, 0x21, 0x0f, + 0x00, 0xc4, 0x8a, 0x46, 0x9e, 0xeb, 0xb3, 0x0b, 0x6e, 0x19, 0xd5, 0xb7, 0x32, 0x4d, 0x98, 0xaf, + 0xd9, 0x05, 0x77, 0x5a, 0x22, 0x1f, 0x26, 0x4e, 0x06, 0x9c, 0xaf, 0xe7, 0x74, 0xb1, 0x76, 0x3d, + 0x0c, 0x24, 0x2d, 0x9c, 0x6c, 0xa7, 0x4e, 0xe6, 0xec, 0xa3, 0x84, 0xcc, 0x9d, 0x3c, 0x81, 0x06, + 0xb2, 0xa5, 0xcf, 0xd0, 0xea, 0xd8, 0xfa, 0xa8, 0x3b, 0x21, 0xf9, 0x19, 0x8f, 0x15, 0x3a, 0xbb, + 0x0c, 0xd1, 0xc9, 0x14, 0xdf, 0xd4, 0x9a, 0x2d, 0x13, 0x86, 0xcf, 0xa0, 0x53, 0xf1, 0x8d, 0x7c, + 0x01, 0x1d, 0xf5, 0x12, 0x0a, 0x97, 0x75, 0xe5, 0x72, 0x2f, 0xdf, 0xe9, 0x49, 0x89, 0xcc, 0x4d, + 0xae, 0x2c, 0x18, 0xfe, 0xa2, 0x43, 0x27, 0x6b, 0xd4, 0xcc, 0x9e, 0xb7, 0xa1, 0xf9, 0x23, 0x8d, + 0x98, 0xcf, 0x96, 0x22, 0x6d, 0xd6, 0x73, 0xcd, 0x29, 0x10, 0xf2, 0x39, 0x40, 0xd2, 0x46, 0x02, + 0x23, 0x3f, 0xeb, 0x7c, 0x63, 0xf2, 0x56, 0x12, 0xa5, 0x0d, 0xca, 0x15, 0xc6, 0xc2, 0x5d, 0xf0, + 0xf0, 0xf2, 0x74, 0xa6, 0xfa, 0x31, 0x91, 0x9c, 0x6b, 0x4e, 0x69, 0x01, 0x39, 0x81, 0xba, 0x48, + 0x82, 0xa6, 0x5a, 0xd2, 0xd8, 0x96, 0xbc, 0x8d, 0xe0, 0xb9, 0xe6, 0xa4, 0x92, 0xb3, 0x26, 0x34, + 0x22, 0x14, 0x71, 0x20, 0x87, 0x1f, 0x97, 0x62, 0x42, 0x7a, 0x50, 0xfb, 0x5e, 0x70, 0xa6, 0x9e, + 0xad, 0x7d, 0xae, 0x39, 0x6a, 0x76, 0x06, 0xd0, 0x44, 0xb6, 0xe0, 0x9e, 0xcf, 0x96, 0xc3, 0xdf, + 0xea, 0x70, 0x37, 0xad, 0x89, 0xb2, 0x25, 0xee, 0x91, 0x40, 0x73, 0x87, 0x04, 0x7e, 0x04, 0x44, + 0x48, 0x1a, 0x49, 0xf7, 0x96, 0x1c, 0x9a, 0x8a, 0x99, 0x95, 0xc2, 0x38, 0x02, 0x13, 0x99, 0x57, + 0xd5, 0x66, 0x69, 0x44, 0xe6, 0x95, 0x95, 0x1f, 0x82, 0xe9, 0x33, 0x89, 0xd1, 0x0f, 0x34, 0x78, + 0x25, 0x87, 0x47, 0x39, 0xfe, 0x2f, 0x09, 0xaf, 0xef, 0x99, 0xf0, 0xc6, 0x5e, 0x09, 0x3f, 0xdc, + 0x29, 0xe1, 0xcd, 0xd7, 0x4d, 0x78, 0x6b, 0x8f, 0x84, 0xc3, 0xee, 0x09, 0x6f, 0xff, 0x47, 0xc2, + 0x3b, 0xaf, 0x95, 0xf0, 0xee, 0x4e, 0x09, 0x3f, 0xda, 0x21, 0xe1, 0x86, 0xd9, 0x1e, 0xfe, 0xaa, + 0x03, 0x29, 0xb7, 0xee, 0xff, 0x36, 0x93, 0x27, 0x9f, 0x02, 0x6c, 0xab, 0x20, 0x06, 0x1c, 0x7a, + 0x78, 0x41, 0xe3, 0x40, 0x9a, 0x1a, 0xe9, 0x02, 0x6c, 0x0f, 0x37, 0x75, 0x02, 0x90, 0x7d, 0xd8, + 0xcd, 0x3b, 0x93, 0x9f, 0x74, 0xa8, 0xab, 0x8d, 0xc9, 0x67, 0xf9, 0xa0, 0x57, 0x39, 0x30, 0x8b, + 0x6b, 0xff, 0xf8, 0x15, 0x34, 0x75, 0xe2, 0x81, 0x4e, 0x1e, 0x67, 0x1f, 0x6c, 0xe5, 0x10, 0xb9, + 0x57, 0x95, 0x95, 0x02, 0xdf, 0xef, 0xdf, 0x46, 0xe5, 0xdb, 0x9c, 0xdd, 0xbf, 0xfa, 0x7b, 0xa0, + 0x5d, 0x5d, 0x0f, 0xf4, 0x97, 0xd7, 0x03, 0xfd, 0xaf, 0xeb, 0x81, 0xfe, 0xf3, 0xcd, 0x40, 0x7b, + 0x79, 0x33, 0xd0, 0xfe, 0xb8, 0x19, 0x68, 0xdf, 0x1d, 0x66, 0xbf, 0x27, 0xf3, 0x86, 0xfa, 0x4b, + 0xf8, 0xe4, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3b, 0x44, 0xb0, 0xce, 0xba, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -672,6 +813,39 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Metadata: "api/query/querypb/query.proto", } +func (m *QueryStats) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryStats) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryStats) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PeakSamples != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PeakSamples)) + i-- + dAtA[i] = 0x10 + } + if m.SamplesTotal != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.SamplesTotal)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *QueryRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -908,6 +1082,27 @@ func (m *QueryResponse_Timeseries) MarshalToSizedBuffer(dAtA []byte) (int, error } return len(dAtA) - i, nil } +func (m *QueryResponse_Stats) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryResponse_Stats) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Stats != nil { + { + size, err := m.Stats.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} func (m *QueryPlan) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1167,6 +1362,27 @@ func (m *QueryRangeResponse_Timeseries) MarshalToSizedBuffer(dAtA []byte) (int, } return len(dAtA) - i, nil } +func (m *QueryRangeResponse_Stats) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryRangeResponse_Stats) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Stats != nil { + { + size, err := m.Stats.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -1178,6 +1394,21 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *QueryStats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SamplesTotal != 0 { + n += 1 + sovQuery(uint64(m.SamplesTotal)) + } + if m.PeakSamples != 0 { + n += 1 + sovQuery(uint64(m.PeakSamples)) + } + return n +} + func (m *QueryRequest) Size() (n int) { if m == nil { return 0 @@ -1284,6 +1515,18 @@ func (m *QueryResponse_Timeseries) Size() (n int) { } return n } +func (m *QueryResponse_Stats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Stats != nil { + l = m.Stats.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} func (m *QueryPlan) Size() (n int) { if m == nil { return 0 @@ -1405,6 +1648,18 @@ func (m *QueryRangeResponse_Timeseries) Size() (n int) { } return n } +func (m *QueryRangeResponse_Stats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Stats != nil { + l = m.Stats.Size() + n += 1 + l + sovQuery(uint64(l)) + } + return n +} func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 @@ -1412,6 +1667,94 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (m *QueryStats) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryStats: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryStats: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SamplesTotal", wireType) + } + m.SamplesTotal = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SamplesTotal |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PeakSamples", wireType) + } + m.PeakSamples = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PeakSamples |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *QueryRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1967,6 +2310,124 @@ func (m *QueryResponse) Unmarshal(dAtA []byte) error { } m.Result = &QueryResponse_Timeseries{v} iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Stats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &QueryStats{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Result = &QueryResponse_Stats{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPlan) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: queryPlan: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: queryPlan: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Json", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := make([]byte, postIndex-iNdEx) + copy(v, dAtA[iNdEx:postIndex]) + m.Encoding = &QueryPlan_Json{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) @@ -2580,6 +3041,41 @@ func (m *QueryRangeResponse) Unmarshal(dAtA []byte) error { } m.Result = &QueryRangeResponse_Timeseries{v} iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Stats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &QueryStats{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Result = &QueryRangeResponse_Stats{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) diff --git a/pkg/api/query/querypb/query.proto b/pkg/api/query/querypb/query.proto index d6b5e4628f..d8f4a88f20 100644 --- a/pkg/api/query/querypb/query.proto +++ b/pkg/api/query/querypb/query.proto @@ -28,6 +28,11 @@ enum EngineType { thanos = 2; } +message QueryStats { + int64 samples_total = 1; + int64 peak_samples = 2; +} + message QueryRequest { string query = 1; queryPlan queryPlan = 14; @@ -63,6 +68,15 @@ message QueryResponse { /// timeseries is one series from the result of the executed query. prometheus_copy.TimeSeries timeseries = 2; + + // performance stats + QueryStats stats = 3; + } +} + +message queryPlan { + oneof encoding { + bytes json = 1; } } @@ -105,6 +119,9 @@ message QueryRangeResponse { /// timeseries is one series from the result of the executed query. prometheus_copy.TimeSeries timeseries = 2; + + // performance stats + QueryStats stats = 3; } } diff --git a/pkg/api/query/querypb/responses.go b/pkg/api/query/querypb/responses.go index 7ade9c361c..eda01ca3d0 100644 --- a/pkg/api/query/querypb/responses.go +++ b/pkg/api/query/querypb/responses.go @@ -17,6 +17,14 @@ func NewQueryResponse(series *prompb.TimeSeries) *QueryResponse { } } +func NewQueryStatsResponse(stats *QueryStats) *QueryResponse { + return &QueryResponse{ + Result: &QueryResponse_Stats{ + Stats: stats, + }, + } +} + func NewQueryWarningsResponse(errs ...error) *QueryResponse { warnings := make([]string, 0, len(errs)) for _, err := range errs { @@ -37,6 +45,14 @@ func NewQueryRangeResponse(series *prompb.TimeSeries) *QueryRangeResponse { } } +func NewQueryRangeStatsResponse(stats *QueryStats) *QueryRangeResponse { + return &QueryRangeResponse{ + Result: &QueryRangeResponse_Stats{ + Stats: stats, + }, + } +} + func NewQueryRangeWarningsResponse(errs ...error) *QueryRangeResponse { warnings := make([]string, 0, len(errs)) for _, err := range errs { diff --git a/pkg/api/query/v1.go b/pkg/api/query/v1.go index 2e020928d7..49b40b1597 100644 --- a/pkg/api/query/v1.go +++ b/pkg/api/query/v1.go @@ -52,6 +52,7 @@ import ( "github.com/thanos-io/thanos/pkg/exemplars" "github.com/thanos-io/thanos/pkg/exemplars/exemplarspb" extpromhttp "github.com/thanos-io/thanos/pkg/extprom/http" + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/gate" "github.com/thanos-io/thanos/pkg/logging" "github.com/thanos-io/thanos/pkg/metadata" @@ -81,6 +82,9 @@ const ( LookbackDeltaParam = "lookback_delta" EngineParam = "engine" QueryAnalyzeParam = "analyze" + RuleNameParam = "rule_name[]" + RuleGroupParam = "rule_group[]" + FileParam = "file[]" ) type PromqlEngineType string @@ -121,13 +125,19 @@ func (f *QueryEngineFactory) GetPrometheusEngine() promql.QueryEngine { func (f *QueryEngineFactory) GetThanosEngine() ThanosEngine { f.createThanosEngine.Do(func() { + opts := engine.Opts{ + EngineOpts: f.engineOpts, + Engine: f.GetPrometheusEngine(), + EnableAnalysis: true, + EnableXFunctions: f.enableXFunctions, + } if f.thanosEngine != nil { return } if f.remoteEngineEndpoints == nil { - f.thanosEngine = engine.New(engine.Opts{EngineOpts: f.engineOpts, Engine: f.GetPrometheusEngine(), EnableAnalysis: true, EnableXFunctions: f.enableXFunctions}) + f.thanosEngine = engine.New(opts) } else { - f.thanosEngine = engine.NewDistributedEngine(engine.Opts{EngineOpts: f.engineOpts, Engine: f.GetPrometheusEngine(), EnableAnalysis: true}, f.remoteEngineEndpoints) + f.thanosEngine = engine.NewDistributedEngine(opts, f.remoteEngineEndpoints) } }) @@ -368,7 +378,7 @@ func (qapi *QueryAPI) parseStoreDebugMatchersParam(r *http.Request) (storeMatche } for _, s := range r.Form[StoreMatcherParam] { - matchers, err := parser.ParseMetricSelector(s) + matchers, err := extpromql.ParseMetricSelector(s) if err != nil { return nil, &api.ApiError{Typ: api.ErrorBadData, Err: err} } @@ -484,7 +494,7 @@ func processAnalysis(a *engine.AnalyzeOutputNode) queryTelemetry { analysis.PeakSamples = a.PeakSamples() analysis.TotalSamples = a.TotalSamples() for _, c := range a.Children { - analysis.Children = append(analysis.Children, processAnalysis(&c)) + analysis.Children = append(analysis.Children, processAnalysis(c)) } return analysis } @@ -661,45 +671,48 @@ func (qapi *QueryAPI) query(r *http.Request) (interface{}, []error, *api.ApiErro return nil, nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}, func() {} } - // We are starting promQL tracing span here, because we have no control over promQL code. - span, ctx := tracing.StartSpan(ctx, "promql_instant_query") - defer span.Finish() - - var seriesStats []storepb.SeriesStatsCounter - qry, err := engine.NewInstantQuery( - ctx, - qapi.queryableCreate( - enableDedup, - replicaLabels, - storeDebugMatchers, - maxSourceResolution, - enablePartialResponse, - false, - shardInfo, - query.NewAggregateStatsReporter(&seriesStats), - ), - promql.NewPrometheusQueryOpts(false, lookbackDelta), - queryStr, - ts, + var ( + qry promql.Query + seriesStats []storepb.SeriesStatsCounter ) - - if err != nil { + if err := tracing.DoInSpanWithErr(ctx, "instant_query_create", func(ctx context.Context) error { + var err error + qry, err = engine.NewInstantQuery( + ctx, + qapi.queryableCreate( + enableDedup, + replicaLabels, + storeDebugMatchers, + maxSourceResolution, + enablePartialResponse, + false, + shardInfo, + query.NewAggregateStatsReporter(&seriesStats), + ), + promql.NewPrometheusQueryOpts(false, lookbackDelta), + queryStr, + ts, + ) + return err + }); err != nil { return nil, nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}, func() {} } - res := qry.Exec(ctx) + analysis, err := qapi.parseQueryAnalyzeParam(r, qry) if err != nil { return nil, nil, apiErr, func() {} } - tracing.DoInSpan(ctx, "query_gate_ismyturn", func(ctx context.Context) { - err = qapi.gate.Start(ctx) - }) - if err != nil { + if err := tracing.DoInSpanWithErr(ctx, "query_gate_ismyturn", qapi.gate.Start); err != nil { return nil, nil, &api.ApiError{Typ: api.ErrorExec, Err: err}, qry.Close } defer qapi.gate.Done() beforeRange := time.Now() + + var res *promql.Result + tracing.DoInSpan(ctx, "instant_query_exec", func(ctx context.Context) { + res = qry.Exec(ctx) + }) if res.Err != nil { switch res.Err.(type) { case promql.ErrQueryCanceled: @@ -959,48 +972,49 @@ func (qapi *QueryAPI) queryRange(r *http.Request) (interface{}, []error, *api.Ap // Record the query range requested. qapi.queryRangeHist.Observe(end.Sub(start).Seconds()) - // We are starting promQL tracing span here, because we have no control over promQL code. - span, ctx := tracing.StartSpan(ctx, "promql_range_query") - defer span.Finish() - - var seriesStats []storepb.SeriesStatsCounter - qry, err := engine.NewRangeQuery( - ctx, - qapi.queryableCreate( - enableDedup, - replicaLabels, - storeDebugMatchers, - maxSourceResolution, - enablePartialResponse, - false, - shardInfo, - query.NewAggregateStatsReporter(&seriesStats), - ), - promql.NewPrometheusQueryOpts(false, lookbackDelta), - queryStr, - start, - end, - step, + var ( + qry promql.Query + seriesStats []storepb.SeriesStatsCounter ) - if err != nil { + if err := tracing.DoInSpanWithErr(ctx, "range_query_create", func(ctx context.Context) error { + var err error + qry, err = engine.NewRangeQuery( + ctx, + qapi.queryableCreate( + enableDedup, + replicaLabels, + storeDebugMatchers, + maxSourceResolution, + enablePartialResponse, + false, + shardInfo, + query.NewAggregateStatsReporter(&seriesStats), + ), + promql.NewPrometheusQueryOpts(false, lookbackDelta), + queryStr, + start, + end, + step, + ) + return err + }); err != nil { return nil, nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}, func() {} } - - res := qry.Exec(ctx) - analysis, err := qapi.parseQueryAnalyzeParam(r, qry) if err != nil { return nil, nil, apiErr, func() {} } - tracing.DoInSpan(ctx, "query_gate_ismyturn", func(ctx context.Context) { - err = qapi.gate.Start(ctx) - }) - if err != nil { + if err := tracing.DoInSpanWithErr(ctx, "query_gate_ismyturn", qapi.gate.Start); err != nil { return nil, nil, &api.ApiError{Typ: api.ErrorExec, Err: err}, qry.Close } defer qapi.gate.Done() + var res *promql.Result + tracing.DoInSpan(ctx, "range_query_exec", func(ctx context.Context) { + res = qry.Exec(ctx) + + }) beforeRange := time.Now() if res.Err != nil { switch res.Err.(type) { @@ -1053,6 +1067,11 @@ func (qapi *QueryAPI) labelValues(r *http.Request) (interface{}, []error, *api.A return nil, nil, apiErr, func() {} } + limit, err := parseLimitParam(r.FormValue("limit")) + if err != nil { + return nil, nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}, func() {} + } + matcherSets, ctx, err := tenancy.RewriteLabelMatchers(ctx, r, qapi.tenantHeader, qapi.defaultTenant, qapi.tenantCertField, qapi.enforceTenancy, qapi.tenantLabel, r.Form[MatcherParam]) if err != nil { apiErr = &api.ApiError{Typ: api.ErrorBadData, Err: err} @@ -1074,6 +1093,10 @@ func (qapi *QueryAPI) labelValues(r *http.Request) (interface{}, []error, *api.A } defer runutil.CloseWithLogOnErr(qapi.logger, q, "queryable labelValues") + hints := &storage.LabelHints{ + Limit: toHintLimit(limit), + } + var ( vals []string warnings annotations.Annotations @@ -1082,7 +1105,7 @@ func (qapi *QueryAPI) labelValues(r *http.Request) (interface{}, []error, *api.A var callWarnings annotations.Annotations labelValuesSet := make(map[string]struct{}) for _, matchers := range matcherSets { - vals, callWarnings, err = q.LabelValues(ctx, name, matchers...) + vals, callWarnings, err = q.LabelValues(ctx, name, hints, matchers...) if err != nil { return nil, nil, &api.ApiError{Typ: api.ErrorExec, Err: err}, func() {} } @@ -1098,7 +1121,7 @@ func (qapi *QueryAPI) labelValues(r *http.Request) (interface{}, []error, *api.A } sort.Strings(vals) } else { - vals, warnings, err = q.LabelValues(ctx, name) + vals, warnings, err = q.LabelValues(ctx, name, hints) if err != nil { return nil, nil, &api.ApiError{Typ: api.ErrorExec, Err: err}, func() {} } @@ -1108,6 +1131,11 @@ func (qapi *QueryAPI) labelValues(r *http.Request) (interface{}, []error, *api.A vals = make([]string, 0) } + if limit > 0 && len(vals) > limit { + vals = vals[:limit] + warnings = warnings.Add(errors.New("results truncated due to limit")) + } + return vals, warnings.AsErrors(), nil, func() {} } @@ -1146,6 +1174,11 @@ func (qapi *QueryAPI) series(r *http.Request) (interface{}, []error, *api.ApiErr return nil, nil, apiErr, func() {} } + limit, err := parseLimitParam(r.FormValue("limit")) + if err != nil { + return nil, nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}, func() {} + } + enablePartialResponse, apiErr := qapi.parsePartialResponseParam(r, qapi.enableQueryPartialResponse) if apiErr != nil { return nil, nil, apiErr, func() {} @@ -1171,18 +1204,31 @@ func (qapi *QueryAPI) series(r *http.Request) (interface{}, []error, *api.ApiErr metrics = []labels.Labels{} sets []storage.SeriesSet ) + + hints := &storage.SelectHints{ + Limit: toHintLimit(limit), + Start: start.UnixMilli(), + End: end.UnixMilli(), + } + for _, mset := range matcherSets { - sets = append(sets, q.Select(ctx, false, nil, mset...)) + sets = append(sets, q.Select(ctx, false, hints, mset...)) } set := storage.NewMergeSeriesSet(sets, storage.ChainedSeriesMerge) + warnings := set.Warnings() for set.Next() { metrics = append(metrics, set.At().Labels()) + if limit > 0 && len(metrics) > limit { + metrics = metrics[:limit] + warnings.Add(errors.New("results truncated due to limit")) + return metrics, warnings.AsErrors(), nil, func() {} + } } if set.Err() != nil { return nil, nil, &api.ApiError{Typ: api.ErrorExec, Err: set.Err()}, func() {} } - return metrics, set.Warnings().AsErrors(), nil, func() {} + return metrics, warnings.AsErrors(), nil, func() {} } func (qapi *QueryAPI) labelNames(r *http.Request) (interface{}, []error, *api.ApiError, func()) { @@ -1201,6 +1247,11 @@ func (qapi *QueryAPI) labelNames(r *http.Request) (interface{}, []error, *api.Ap return nil, nil, apiErr, func() {} } + limit, err := parseLimitParam(r.FormValue("limit")) + if err != nil { + return nil, nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}, func() {} + } + matcherSets, ctx, err := tenancy.RewriteLabelMatchers(r.Context(), r, qapi.tenantHeader, qapi.defaultTenant, qapi.tenantCertField, qapi.enforceTenancy, qapi.tenantLabel, r.Form[MatcherParam]) if err != nil { apiErr := &api.ApiError{Typ: api.ErrorBadData, Err: err} @@ -1227,11 +1278,15 @@ func (qapi *QueryAPI) labelNames(r *http.Request) (interface{}, []error, *api.Ap warnings annotations.Annotations ) + hints := &storage.LabelHints{ + Limit: toHintLimit(limit), + } + if len(matcherSets) > 0 { var callWarnings annotations.Annotations labelNamesSet := make(map[string]struct{}) for _, matchers := range matcherSets { - names, callWarnings, err = q.LabelNames(ctx, matchers...) + names, callWarnings, err = q.LabelNames(ctx, hints, matchers...) if err != nil { return nil, nil, &api.ApiError{Typ: api.ErrorExec, Err: err}, func() {} } @@ -1247,7 +1302,7 @@ func (qapi *QueryAPI) labelNames(r *http.Request) (interface{}, []error, *api.Ap } sort.Strings(names) } else { - names, warnings, err = q.LabelNames(ctx) + names, warnings, err = q.LabelNames(ctx, hints) } if err != nil { @@ -1257,6 +1312,11 @@ func (qapi *QueryAPI) labelNames(r *http.Request) (interface{}, []error, *api.Ap names = make([]string, 0) } + if limit > 0 && len(names) > limit { + names = names[:limit] + warnings = warnings.Add(errors.New("results truncated due to limit")) + } + return names, warnings.AsErrors(), nil, func() {} } @@ -1386,6 +1446,9 @@ func NewRulesHandler(client rules.UnaryClient, enablePartialResponse bool) func( Type: rulespb.RulesRequest_Type(typ), PartialResponseStrategy: ps, MatcherString: r.Form[MatcherParam], + RuleName: r.Form[RuleNameParam], + RuleGroup: r.Form[RuleGroupParam], + File: r.Form[FileParam], } tracing.DoInSpan(ctx, "retrieve_rules", func(ctx context.Context) { groups, warnings, err = client.Rules(ctx, req) @@ -1515,6 +1578,33 @@ func parseDuration(s string) (time.Duration, error) { return 0, errors.Errorf("cannot parse %q to a valid duration", s) } +// parseLimitParam returning 0 means no limit is to be applied. +func parseLimitParam(s string) (int, error) { + if s == "" { + return 0, nil + } + + limit, err := strconv.Atoi(s) + if err != nil { + return 0, errors.Errorf("cannot parse %q to a valid limit", s) + } + if limit < 0 { + return 0, errors.New("limit must be non-negative") + } + + return limit, nil +} + +// toHintLimit increases the API limit, as returned by parseLimitParam, by 1. +// This allows for emitting warnings when the results are truncated. +func toHintLimit(limit int) int { + // 0 means no limit and avoid int overflow + if limit > 0 && limit < math.MaxInt { + return limit + 1 + } + return limit +} + // NewMetricMetadataHandler creates handler compatible with HTTP /api/v1/metadata https://prometheus.io/docs/prometheus/latest/querying/api/#querying-metric-metadata // which uses gRPC Unary Metadata API. func NewMetricMetadataHandler(client metadata.UnaryClient, enablePartialResponse bool) func(*http.Request) (interface{}, []error, *api.ApiError, func()) { diff --git a/pkg/api/query/v1_test.go b/pkg/api/query/v1_test.go index a820abe351..0c08a0ebca 100644 --- a/pkg/api/query/v1_test.go +++ b/pkg/api/query/v1_test.go @@ -1038,6 +1038,15 @@ func TestMetadataEndpoints(t *testing.T) { }, response: []string{"__name__", "foo", "replica1"}, }, + // With limit + { + endpoint: api.labelNames, + query: url.Values{ + "match[]": []string{`test_metric_replica2`}, + "limit": []string{"2"}, + }, + response: []string{"__name__", "foo"}, + }, { endpoint: api.labelValues, query: url.Values{ @@ -1058,6 +1067,18 @@ func TestMetadataEndpoints(t *testing.T) { }, response: []string{"test_metric1", "test_metric2", "test_metric_replica1", "test_metric_replica2"}, }, + // With limit + { + endpoint: api.labelValues, + query: url.Values{ + "match[]": []string{`{foo="bar"}`, `{foo="boo"}`}, + "limit": []string{"3"}, + }, + params: map[string]string{ + "name": "__name__", + }, + response: []string{"test_metric1", "test_metric2", "test_metric_replica1"}, + }, // No matched series. { endpoint: api.labelValues, @@ -1357,6 +1378,32 @@ func TestMetadataEndpoints(t *testing.T) { errType: baseAPI.ErrorBadData, method: http.MethodPost, }, + // With limit + { + endpoint: api.series, + query: url.Values{ + "match[]": []string{`{replica="", foo=~"b.+", replica1=""}`}, + "limit": []string{"2"}, + }, + response: []labels.Labels{ + labels.FromStrings("__name__", "test_metric1", "foo", "bar"), + labels.FromStrings("__name__", "test_metric1", "foo", "boo"), + }, + method: http.MethodPost, + }, + // Without limit + { + endpoint: api.series, + query: url.Values{ + "match[]": []string{`{replica="", foo=~"b.+", replica1=""}`}, + }, + response: []labels.Labels{ + labels.FromStrings("__name__", "test_metric1", "foo", "bar"), + labels.FromStrings("__name__", "test_metric1", "foo", "boo"), + labels.FromStrings("__name__", "test_metric2", "foo", "boo"), + }, + method: http.MethodPost, + }, } for i, test := range tests { @@ -1675,6 +1722,16 @@ func TestParseStoreDebugMatchersParam(t *testing.T) { labels.MustNewMatcher(labels.MatchEqual, "cluster", "test"), }}, }, + { + storeMatchers: `{__address__=~"localhost:.*"}`, + fail: false, + result: [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchRegexp, "__address__", "localhost:.*")}}, + }, + { + storeMatchers: `{__address__!~"localhost:.*"}`, + fail: false, + result: [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchNotRegexp, "__address__", "localhost:.*")}}, + }, } { t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { api := QueryAPI{ @@ -1689,15 +1746,64 @@ func TestParseStoreDebugMatchersParam(t *testing.T) { storeMatchers, err := api.parseStoreDebugMatchersParam(r) if !tc.fail { - testutil.Equals(t, tc.result, storeMatchers) + testutil.Equals(t, len(tc.result), len(storeMatchers)) + for i, m := range tc.result { + testutil.Equals(t, len(m), len(storeMatchers[i])) + for j, n := range m { + testutil.Equals(t, n.String(), storeMatchers[i][j].String()) + } + } testutil.Equals(t, (*baseAPI.ApiError)(nil), err) } else { testutil.NotOk(t, err) } + + // We don't care about results but checking for panic. + for _, matchers := range storeMatchers { + for _, matcher := range matchers { + _ = matcher.Matches("") + } + } }) } } +func TestParseLimitParam(t *testing.T) { + var tests = []struct { + input string + fail bool + result int + }{ + { + input: "", + fail: false, + result: 0, + }, { + input: "abc", + fail: true, + }, { + input: "10", + fail: false, + result: 10, + }, + } + + for _, test := range tests { + res, err := parseLimitParam(test.input) + if err != nil && !test.fail { + t.Errorf("Unexpected error for %q: %s", test.input, err) + continue + } + if err == nil && test.fail { + t.Errorf("Expected error for %q but got none", test.input) + continue + } + if !test.fail && res != test.result { + t.Errorf("Expected limit %v for input %q but got %v", test.result, test.input, res) + } + } +} + func TestRulesHandler(t *testing.T) { twoHAgo := time.Now().Add(-2 * time.Hour) all := []*rulespb.Rule{ diff --git a/pkg/block/block.go b/pkg/block/block.go index 64add7fb51..00fda38831 100644 --- a/pkg/block/block.go +++ b/pkg/block/block.go @@ -130,7 +130,7 @@ func upload(ctx context.Context, logger log.Logger, bkt objstore.Bucket, bdir st } if checkExternalLabels { - if meta.Thanos.Labels == nil || len(meta.Thanos.Labels) == 0 { + if len(meta.Thanos.Labels) == 0 { return errors.New("empty external labels are not allowed for Thanos block.") } } diff --git a/pkg/block/fetcher.go b/pkg/block/fetcher.go index 4911b4748b..02e9dec513 100644 --- a/pkg/block/fetcher.go +++ b/pkg/block/fetcher.go @@ -213,7 +213,7 @@ func (f *RecursiveLister) GetActiveAndPartialBlockIDs(ctx context.Context, ch ch case ch <- id: } return nil - }, objstore.WithRecursiveIter) + }, objstore.WithRecursiveIter()) return partialBlocks, err } @@ -257,7 +257,11 @@ func (f *ConcurrentLister) GetActiveAndPartialBlockIDs(ctx context.Context, ch c mu.Unlock() continue } - ch <- uid + select { + case <-ctx.Done(): + return ctx.Err() + case ch <- uid: + } } return nil }) @@ -585,8 +589,6 @@ func (f *BaseFetcher) fetch(ctx context.Context, metrics *FetcherMetrics, filter metrics.SyncFailures.Inc() } }() - metrics.Syncs.Inc() - metrics.ResetTx() // Run this in thread safe run group. // TODO(bwplotka): Consider custom singleflight with ttl. @@ -617,7 +619,6 @@ func (f *BaseFetcher) fetch(ctx context.Context, metrics *FetcherMetrics, filter } metrics.Synced.WithLabelValues(LoadedMeta).Set(float64(len(metas))) - metrics.Submit() if len(resp.metaErrs) > 0 { return metas, resp.partial, errors.Wrap(resp.metaErrs.Err(), "incomplete view") @@ -650,6 +651,9 @@ type MetaFetcher struct { // // Returned error indicates a failure in fetching metadata. Returned meta can be assumed as correct, with some blocks missing. func (f *MetaFetcher) Fetch(ctx context.Context) (metas map[ulid.ULID]*metadata.Meta, partial map[ulid.ULID]error, err error) { + f.metrics.Syncs.Inc() + f.metrics.ResetTx() + metas, partial, err = f.wrapped.fetch(ctx, f.metrics, f.filters) if f.listener != nil { blocks := make([]metadata.Meta, 0, len(metas)) @@ -658,6 +662,8 @@ func (f *MetaFetcher) Fetch(ctx context.Context) (metas map[ulid.ULID]*metadata. } f.listener(blocks, err) } + + f.metrics.Submit() return metas, partial, err } diff --git a/pkg/block/indexheader/binary_reader.go b/pkg/block/indexheader/binary_reader.go index c86185bfbf..1afaabb786 100644 --- a/pkg/block/indexheader/binary_reader.go +++ b/pkg/block/indexheader/binary_reader.go @@ -875,6 +875,7 @@ func (r *BinaryReader) postingsOffset(name string, values ...string) ([]index.Ra // Iterate on the offset table. newSameRngs = newSameRngs[:0] + Iter: for d.Err() == nil { // Posting format entry is as follows: // │ ┌────────────────────────────────────────┐ │ @@ -916,6 +917,15 @@ func (r *BinaryReader) postingsOffset(name string, values ...string) ([]index.Ra break } wantedValue = values[valueIndex] + // Only do this if there is no new range added. If there is an existing + // range we want to continue iterating the offset table to get the end. + if len(newSameRngs) == 0 && i+1 < len(e.offsets) { + // We want to limit this loop within e.offsets[i, i+1). So when the wanted value + // is >= e.offsets[i+1], go out of the loop and binary search again. + if wantedValue >= e.offsets[i+1].value { + break Iter + } + } } if i+1 == len(e.offsets) { @@ -942,7 +952,7 @@ func (r *BinaryReader) postingsOffset(name string, values ...string) ([]index.Ra if len(newSameRngs) > 0 { // We added some ranges in this iteration. Use next posting offset as the end of our ranges. - // We know it exists as we never go further in this loop than e.offsets[i, i+1]. + // We know it exists as we never go further in this loop than e.offsets[i, i+1). skipNAndName(&d, &buf) d.UvarintBytes() // Label value. diff --git a/pkg/block/indexheader/header_test.go b/pkg/block/indexheader/header_test.go index 4130157a96..b94a857f64 100644 --- a/pkg/block/indexheader/header_test.go +++ b/pkg/block/indexheader/header_test.go @@ -7,9 +7,12 @@ import ( "context" "fmt" "math" + "math/rand" "path/filepath" + "sort" "strconv" "testing" + "time" "github.com/go-kit/log" "github.com/oklog/ulid" @@ -18,6 +21,7 @@ import ( "github.com/prometheus/prometheus/tsdb/encoding" "github.com/prometheus/prometheus/tsdb/fileutil" "github.com/prometheus/prometheus/tsdb/index" + "github.com/stretchr/testify/require" "github.com/thanos-io/objstore" "github.com/thanos-io/objstore/providers/filesystem" @@ -38,22 +42,25 @@ func TestReaders(t *testing.T) { // Create block index version 2. id1, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - {{Name: "a", Value: "3"}}, - {{Name: "a", Value: "4"}}, - {{Name: "a", Value: "5"}}, - {{Name: "a", Value: "6"}}, - {{Name: "a", Value: "7"}}, - {{Name: "a", Value: "8"}}, - {{Name: "a", Value: "9"}}, + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + labels.FromStrings("a", "3"), + labels.FromStrings("a", "4"), + labels.FromStrings("a", "5"), + labels.FromStrings("a", "6"), + labels.FromStrings("a", "7"), + labels.FromStrings("a", "8"), + labels.FromStrings("a", "9"), // Missing 10 on purpose. - {{Name: "a", Value: "11"}}, - {{Name: "a", Value: "12"}}, - {{Name: "a", Value: "13"}}, - {{Name: "a", Value: "1"}, {Name: "longer-string", Value: "1"}}, - {{Name: "a", Value: "1"}, {Name: "longer-string", Value: "2"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "11"), + labels.FromStrings("a", "12"), + labels.FromStrings("a", "13"), + labels.FromStrings("a", "1", "longer-string", "1"), + labels.FromStrings("a", "1", "longer-string", "2"), + labels.FromStrings("cluster", "a-eu-west-1"), + labels.FromStrings("cluster", "b-eu-west-1"), + labels.FromStrings("cluster", "c-eu-west-1"), + }, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(t, err) testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, id1.String()), metadata.NoneFunc)) @@ -80,7 +87,7 @@ func TestReaders(t *testing.T) { e2eutil.Copy(t, "./testdata/index_format_v1", filepath.Join(tmpDir, m.ULID.String())) _, err = metadata.InjectThanos(log.NewNopLogger(), filepath.Join(tmpDir, m.ULID.String()), metadata.Thanos{ - Labels: labels.Labels{{Name: "ext1", Value: "1"}}.Map(), + Labels: labels.FromStrings("ext1", "1").Map(), Downsample: metadata.ThanosDownsample{Resolution: 0}, Source: metadata.TestSource, }, &m.BlockMeta) @@ -108,15 +115,15 @@ func TestReaders(t *testing.T) { if id == id1 { testutil.Equals(t, 1, br.version) testutil.Equals(t, 2, br.indexVersion) - testutil.Equals(t, &BinaryTOC{Symbols: headerLen, PostingsOffsetTable: 70}, br.toc) - testutil.Equals(t, int64(710), br.indexLastPostingEnd) + testutil.Equals(t, &BinaryTOC{Symbols: headerLen, PostingsOffsetTable: 114}, br.toc) + testutil.Equals(t, int64(905), br.indexLastPostingEnd) testutil.Equals(t, 8, br.symbols.Size()) testutil.Equals(t, 0, len(br.postingsV1)) - testutil.Equals(t, 2, len(br.nameSymbols)) + testutil.Equals(t, 3, len(br.nameSymbols)) testutil.Equals(t, map[string]*postingValueOffsets{ "": { offsets: []postingOffset{{value: "", tableOff: 4}}, - lastValOffset: 440, + lastValOffset: 576, }, "a": { offsets: []postingOffset{ @@ -126,14 +133,21 @@ func TestReaders(t *testing.T) { {value: "7", tableOff: 75}, {value: "9", tableOff: 89}, }, - lastValOffset: 640, + lastValOffset: 776, + }, + "cluster": { + offsets: []postingOffset{ + {value: "a-eu-west-1", tableOff: 96}, + {value: "c-eu-west-1", tableOff: 142}, + }, + lastValOffset: 824, }, "longer-string": { offsets: []postingOffset{ - {value: "1", tableOff: 96}, - {value: "2", tableOff: 115}, + {value: "1", tableOff: 165}, + {value: "2", tableOff: 184}, }, - lastValOffset: 706, + lastValOffset: 901, }, }, br.postings) @@ -173,6 +187,17 @@ func TestReaders(t *testing.T) { testutil.Assert(t, rngs[2].End > rngs[2].Start) testutil.Equals(t, NotFoundRange, rngs[1]) + // 3 values exist and 3 values don't exist. + rngs, err = br.PostingsOffsets("cluster", "a-eu-west-1", "a-us-west-2", "b-eu-west-1", "b-us-east-1", "c-eu-west-1", "c-us-east-2") + testutil.Ok(t, err) + for i := 0; i < len(rngs); i++ { + if i%2 == 0 { + testutil.Assert(t, rngs[i].End > rngs[i].Start) + } else { + testutil.Equals(t, NotFoundRange, rngs[i]) + } + } + // Regression tests for https://github.com/thanos-io/thanos/issues/2213. // Most of not existing value was working despite bug, except in certain unlucky cases // it was causing "invalid size" errors. @@ -356,7 +381,7 @@ func prepareIndexV2Block(t testing.TB, tmpDir string, bkt objstore.Bucket) *meta e2eutil.Copy(t, "./testdata/index_format_v2", filepath.Join(tmpDir, m.ULID.String())) _, err = metadata.InjectThanos(log.NewNopLogger(), filepath.Join(tmpDir, m.ULID.String()), metadata.Thanos{ - Labels: labels.Labels{{Name: "ext1", Value: "1"}}.Map(), + Labels: labels.FromStrings("ext1", "1").Map(), Downsample: metadata.ThanosDownsample{Resolution: 0}, Source: metadata.TestSource, }, &m.BlockMeta) @@ -428,11 +453,11 @@ func benchmarkBinaryReaderLookupSymbol(b *testing.B, numSeries int) { // Generate series labels. seriesLabels := make([]labels.Labels, 0, numSeries) for i := 0; i < numSeries; i++ { - seriesLabels = append(seriesLabels, labels.Labels{{Name: "a", Value: strconv.Itoa(i)}}) + seriesLabels = append(seriesLabels, labels.FromStrings("a", strconv.Itoa(i))) } // Create a block. - id1, err := e2eutil.CreateBlock(ctx, tmpDir, seriesLabels, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + id1, err := e2eutil.CreateBlock(ctx, tmpDir, seriesLabels, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(b, err) testutil.Ok(b, block.Upload(ctx, logger, bkt, filepath.Join(tmpDir, id1.String()), metadata.NoneFunc)) @@ -521,3 +546,82 @@ func readSymbols(bs index.ByteSlice, version, off int) ([]string, map[uint32]str } return symbolSlice, symbols, errors.Wrap(d.Err(), "read symbols") } + +// The idea of this test case is to make sure that reader.PostingsOffsets and +// reader.PostingsOffset get the same index ranges for required label values. +func TestReaderPostingsOffsets(t *testing.T) { + ctx := context.Background() + + tmpDir := t.TempDir() + + possibleClusters := []string{"us-west-2", "us-east-1", "us-east-2", "eu-west-1", "eu-central-1", "ap-southeast-1", "ap-south-1"} + possiblePrefixes := []string{"a", "b", "c", "d", "1", "2", "3", "4"} + totalValues := []string{} + for i := 0; i < len(possibleClusters); i++ { + for j := 0; j < len(possiblePrefixes); j++ { + totalValues = append(totalValues, fmt.Sprintf("%s-%s", possiblePrefixes[j], possibleClusters[i])) + } + } + + rnd := rand.New(rand.NewSource(time.Now().Unix())) + // Pick 5 label values to be used in the block. + clusterLbls := make([]labels.Labels, 0) + valueSet := map[int]struct{}{} + for i := 0; i < 5; { + idx := rnd.Intn(len(totalValues)) + if _, ok := valueSet[idx]; ok { + continue + } + valueSet[idx] = struct{}{} + clusterLbls = append(clusterLbls, labels.FromStrings("cluster", totalValues[idx])) + i++ + } + + // Add additional labels. + lbls := append([]labels.Labels{ + labels.FromStrings("job", "1"), + labels.FromStrings("job", "2"), + labels.FromStrings("job", "3"), + labels.FromStrings("job", "4"), + labels.FromStrings("job", "5"), + labels.FromStrings("job", "6"), + labels.FromStrings("job", "7"), + labels.FromStrings("job", "8"), + labels.FromStrings("job", "9")}, clusterLbls...) + bkt, err := filesystem.NewBucket(filepath.Join(tmpDir, "bkt")) + testutil.Ok(t, err) + defer func() { testutil.Ok(t, bkt.Close()) }() + id, err := e2eutil.CreateBlock(ctx, tmpDir, lbls, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) + testutil.Ok(t, err) + + testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, id.String()), metadata.NoneFunc)) + + fn := filepath.Join(tmpDir, id.String(), block.IndexHeaderFilename) + _, err = WriteBinary(ctx, bkt, id, fn) + testutil.Ok(t, err) + + br, err := NewBinaryReader(ctx, log.NewNopLogger(), nil, tmpDir, id, 3, NewBinaryReaderMetrics(nil)) + testutil.Ok(t, err) + + defer func() { testutil.Ok(t, br.Close()) }() + + for i := 0; i < 100; i++ { + vals := make([]string, 0, 15) + for j := 0; j < 15; j++ { + vals = append(vals, totalValues[rnd.Intn(len(totalValues))]) + } + sort.Strings(vals) + rngs, err := br.PostingsOffsets("cluster", vals...) + require.NoError(t, err) + rngs2 := make([]index.Range, 0) + for _, val := range vals { + rng2, err2 := br.PostingsOffset("cluster", val) + if err2 == NotFoundRangeErr { + rngs2 = append(rngs2, NotFoundRange) + } else { + rngs2 = append(rngs2, rng2) + } + } + require.Equal(t, rngs2, rngs, "Got mismatched results from batched and non-batched API.\nInput cluster labels: %v.\nValues queried: %v", clusterLbls, vals) + } +} diff --git a/pkg/block/indexheader/lazy_binary_reader_test.go b/pkg/block/indexheader/lazy_binary_reader_test.go index d740da99ab..73c47f06fe 100644 --- a/pkg/block/indexheader/lazy_binary_reader_test.go +++ b/pkg/block/indexheader/lazy_binary_reader_test.go @@ -61,9 +61,9 @@ func TestNewLazyBinaryReader_ShouldBuildIndexHeaderFromBucket(t *testing.T) { t.Run(fmt.Sprintf("lazyDownload=%v", lazyDownload), func(t *testing.T) { // Create block. blockID, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(t, err) testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, blockID.String()), metadata.NoneFunc)) @@ -112,9 +112,9 @@ func TestNewLazyBinaryReader_ShouldRebuildCorruptedIndexHeader(t *testing.T) { // Create block. blockID, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(t, err) testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, blockID.String()), metadata.NoneFunc)) @@ -155,9 +155,9 @@ func TestLazyBinaryReader_ShouldReopenOnUsageAfterClose(t *testing.T) { // Create block. blockID, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(t, err) testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, blockID.String()), metadata.NoneFunc)) @@ -210,9 +210,9 @@ func TestLazyBinaryReader_unload_ShouldReturnErrorIfNotIdle(t *testing.T) { // Create block. blockID, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(t, err) testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, blockID.String()), metadata.NoneFunc)) @@ -264,9 +264,9 @@ func TestLazyBinaryReader_LoadUnloadRaceCondition(t *testing.T) { // Create block. blockID, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(t, err) testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, blockID.String()), metadata.NoneFunc)) diff --git a/pkg/block/indexheader/reader_pool.go b/pkg/block/indexheader/reader_pool.go index e9fe5eb7dc..ff3975663c 100644 --- a/pkg/block/indexheader/reader_pool.go +++ b/pkg/block/indexheader/reader_pool.go @@ -32,7 +32,7 @@ func NewReaderPoolMetrics(reg prometheus.Registerer) *ReaderPoolMetrics { } } -// ReaderPool is used to istantiate new index-header readers and keep track of them. +// ReaderPool is used to instantiate new index-header readers and keep track of them. // When the lazy reader is enabled, the pool keeps track of all instantiated readers // and automatically close them once the idle timeout is reached. A closed lazy reader // will be automatically re-opened upon next usage. @@ -73,7 +73,7 @@ func (s IndexHeaderLazyDownloadStrategy) StrategyToDownloadFunc() LazyDownloadIn } } -// LazyDownloadIndexHeaderFunc is used to determinte whether to download the index header lazily +// LazyDownloadIndexHeaderFunc is used to determine whether to download the index header lazily // or not by checking its block metadata. Usecase can be by time or by index file size. type LazyDownloadIndexHeaderFunc func(meta *metadata.Meta) bool diff --git a/pkg/block/indexheader/reader_pool_test.go b/pkg/block/indexheader/reader_pool_test.go index a7445f0fed..331d218724 100644 --- a/pkg/block/indexheader/reader_pool_test.go +++ b/pkg/block/indexheader/reader_pool_test.go @@ -48,9 +48,9 @@ func TestReaderPool_NewBinaryReader(t *testing.T) { // Create block. blockID, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(t, err) testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, blockID.String()), metadata.NoneFunc)) @@ -87,9 +87,9 @@ func TestReaderPool_ShouldCloseIdleLazyReaders(t *testing.T) { // Create block. blockID, err := e2eutil.CreateBlock(ctx, tmpDir, []labels.Labels{ - {{Name: "a", Value: "1"}}, - {{Name: "a", Value: "2"}}, - }, 100, 0, 1000, labels.Labels{{Name: "ext1", Value: "1"}}, 124, metadata.NoneFunc) + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, 100, 0, 1000, labels.FromStrings("ext1", "1"), 124, metadata.NoneFunc) testutil.Ok(t, err) testutil.Ok(t, block.Upload(ctx, log.NewNopLogger(), bkt, filepath.Join(tmpDir, blockID.String()), metadata.NoneFunc)) meta, err := metadata.ReadFromDir(filepath.Join(tmpDir, blockID.String())) diff --git a/pkg/block/metadata/markers.go b/pkg/block/metadata/markers.go index 83273eb343..0a351a5fab 100644 --- a/pkg/block/metadata/markers.go +++ b/pkg/block/metadata/markers.go @@ -79,6 +79,8 @@ const ( IndexSizeExceedingNoCompactReason = "index-size-exceeding" // OutOfOrderChunksNoCompactReason is a reason of to no compact block with index contains out of order chunk so that the compaction is not blocked. OutOfOrderChunksNoCompactReason = "block-index-out-of-order-chunk" + // DownsampleVerticalCompactionNoCompactReason is a reason to not compact overlapping downsampled blocks as it does not make sense e.g. how to vertically compact the average. + DownsampleVerticalCompactionNoCompactReason = "downsample-vertical-compaction" ) // NoCompactMark marker stores reason of block being excluded from compaction if needed. diff --git a/pkg/block/metadata/markers_test.go b/pkg/block/metadata/markers_test.go index 45ed150e72..4413c87430 100644 --- a/pkg/block/metadata/markers_test.go +++ b/pkg/block/metadata/markers_test.go @@ -15,13 +15,13 @@ import ( "github.com/oklog/ulid" "github.com/pkg/errors" "github.com/thanos-io/objstore" - "go.uber.org/goleak" + "github.com/thanos-io/thanos/pkg/testutil/custom" "github.com/efficientgo/core/testutil" ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + custom.TolerantVerifyLeakMain(m) } func TestReadMarker(t *testing.T) { diff --git a/pkg/block/metadata/meta.go b/pkg/block/metadata/meta.go index a479ee242d..11567fb06e 100644 --- a/pkg/block/metadata/meta.go +++ b/pkg/block/metadata/meta.go @@ -20,12 +20,12 @@ import ( "github.com/pkg/errors" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/model/relabel" - "github.com/prometheus/prometheus/promql/parser" "github.com/prometheus/prometheus/tsdb" "github.com/prometheus/prometheus/tsdb/fileutil" "github.com/prometheus/prometheus/tsdb/tombstones" "gopkg.in/yaml.v3" + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/runutil" ) @@ -136,7 +136,7 @@ type Rewrite struct { type Matchers []*labels.Matcher func (m *Matchers) UnmarshalYAML(value *yaml.Node) (err error) { - *m, err = parser.ParseMetricSelector(value.Value) + *m, err = extpromql.ParseMetricSelector(value.Value) if err != nil { return errors.Wrapf(err, "parse metric selector %v", value.Value) } diff --git a/pkg/cache/groupcache.go b/pkg/cache/groupcache.go index 609959d0cb..c68828863f 100644 --- a/pkg/cache/groupcache.go +++ b/pkg/cache/groupcache.go @@ -134,7 +134,7 @@ func NewGroupcacheWithConfig(logger log.Logger, reg prometheus.Registerer, conf go func() { for { - if err := dnsGroupcacheProvider.Resolve(context.Background(), conf.Peers); err != nil { + if err := dnsGroupcacheProvider.Resolve(context.Background(), conf.Peers, true); err != nil { level.Error(logger).Log("msg", "failed to resolve addresses for groupcache", "err", err) } else { err := universe.Set(dnsGroupcacheProvider.Addresses()...) @@ -208,7 +208,7 @@ func NewGroupcacheWithConfig(logger log.Logger, reg prometheus.Registerer, conf if err := bucket.Iter(ctx, parsedData.Name, func(s string) error { list = append(list, s) return nil - }, objstore.WithRecursiveIter); err != nil { + }, objstore.WithRecursiveIter()); err != nil { return err } diff --git a/pkg/cacheutil/memcached_client.go b/pkg/cacheutil/memcached_client.go index 8c10a9a874..e700ffee7b 100644 --- a/pkg/cacheutil/memcached_client.go +++ b/pkg/cacheutil/memcached_client.go @@ -134,7 +134,7 @@ type MemcachedClientConfig struct { MaxItemSize model.Bytes `yaml:"max_item_size"` // MaxGetMultiBatchSize specifies the maximum number of keys a single underlying - // GetMulti() should run. If more keys are specified, internally keys are splitted + // GetMulti() should run. If more keys are specified, internally keys are split // into multiple batches and fetched concurrently, honoring MaxGetMultiConcurrency parallelism. // If set to 0, the max batch size is unlimited. MaxGetMultiBatchSize int `yaml:"max_get_multi_batch_size"` @@ -211,7 +211,7 @@ type memcachedClient struct { // AddressProvider performs node address resolution given a list of clusters. type AddressProvider interface { // Resolves the provided list of memcached cluster to the actual nodes - Resolve(context.Context, []string) error + Resolve(context.Context, []string, bool) error // Returns the nodes Addresses() []string @@ -638,7 +638,7 @@ func (c *memcachedClient) resolveAddrs() error { defer cancel() // If some of the dns resolution fails, log the error. - if err := c.addressProvider.Resolve(ctx, c.config.Addresses); err != nil { + if err := c.addressProvider.Resolve(ctx, c.config.Addresses, true); err != nil { level.Error(c.logger).Log("msg", "failed to resolve addresses for memcached", "addresses", strings.Join(c.config.Addresses, ","), "err", err) } // Fail in case no server address is resolved. diff --git a/pkg/cacheutil/memcached_client_test.go b/pkg/cacheutil/memcached_client_test.go index cac450ef9e..4951075720 100644 --- a/pkg/cacheutil/memcached_client_test.go +++ b/pkg/cacheutil/memcached_client_test.go @@ -13,15 +13,15 @@ import ( "time" "github.com/bradfitz/gomemcache/memcache" + "github.com/efficientgo/core/testutil" "github.com/go-kit/log" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" prom_testutil "github.com/prometheus/client_golang/prometheus/testutil" "github.com/sony/gobreaker" + "github.com/stretchr/testify/require" "go.uber.org/atomic" - "github.com/efficientgo/core/testutil" - "github.com/thanos-io/thanos/pkg/gate" "github.com/thanos-io/thanos/pkg/model" ) @@ -726,7 +726,7 @@ func TestMemcachedClient_SetAsync_CircuitBreaker(t *testing.T) { config := defaultMemcachedClientConfig config.Addresses = []string{"127.0.0.1:11211"} config.SetAsyncCircuitBreaker.Enabled = true - config.SetAsyncCircuitBreaker.OpenDuration = 2 * time.Millisecond + config.SetAsyncCircuitBreaker.OpenDuration = 10 * time.Millisecond config.SetAsyncCircuitBreaker.HalfOpenMaxRequests = 100 config.SetAsyncCircuitBreaker.MinRequests = testdata.minRequests config.SetAsyncCircuitBreaker.ConsecutiveFailures = testdata.consecutiveFailures @@ -750,7 +750,10 @@ func TestMemcachedClient_SetAsync_CircuitBreaker(t *testing.T) { // Trigger the state transaction. time.Sleep(time.Millisecond) testutil.Ok(t, client.SetAsync(strconv.Itoa(testdata.setErrors), []byte("value"), time.Second)) - testutil.Equals(t, gobreaker.StateOpen, cbimpl.State(), "state should be open") + + require.Eventuallyf(t, func() bool { + return cbimpl.State() == gobreaker.StateOpen + }, 2*time.Second, time.Millisecond, "circuit breaker did not open") time.Sleep(config.SetAsyncCircuitBreaker.OpenDuration) for i := testdata.setErrors; i < testdata.setErrors+10; i++ { diff --git a/pkg/clientconfig/http.go b/pkg/clientconfig/http.go index 1198ad7903..4493ebc60b 100644 --- a/pkg/clientconfig/http.go +++ b/pkg/clientconfig/http.go @@ -162,21 +162,28 @@ func NewRoundTripperFromConfig(cfg config_util.HTTPClientConfig, transportConfig // If an authorization_credentials is provided, create a round tripper that will set the // Authorization header correctly on each request. if cfg.Authorization != nil && len(cfg.Authorization.Credentials) > 0 { - rt = config_util.NewAuthorizationCredentialsRoundTripper(cfg.Authorization.Type, cfg.Authorization.Credentials, rt) + rt = config_util.NewAuthorizationCredentialsRoundTripper(cfg.Authorization.Type, config_util.NewInlineSecret(string(cfg.Authorization.Credentials)), rt) } else if cfg.Authorization != nil && len(cfg.Authorization.CredentialsFile) > 0 { - rt = config_util.NewAuthorizationCredentialsFileRoundTripper(cfg.Authorization.Type, cfg.Authorization.CredentialsFile, rt) + rt = config_util.NewAuthorizationCredentialsRoundTripper(cfg.Authorization.Type, config_util.NewFileSecret(cfg.Authorization.CredentialsFile), rt) } // Backwards compatibility, be nice with importers who would not have // called Validate(). if len(cfg.BearerToken) > 0 { - rt = config_util.NewAuthorizationCredentialsRoundTripper("Bearer", cfg.BearerToken, rt) + rt = config_util.NewAuthorizationCredentialsRoundTripper("Bearer", config_util.NewInlineSecret(string(cfg.BearerToken)), rt) } else if len(cfg.BearerTokenFile) > 0 { - rt = config_util.NewAuthorizationCredentialsFileRoundTripper("Bearer", cfg.BearerTokenFile, rt) + rt = config_util.NewAuthorizationCredentialsRoundTripper("Bearer", config_util.NewFileSecret(cfg.BearerTokenFile), rt) } if cfg.BasicAuth != nil { // TODO(yeya24): expose UsernameFile as a config. - rt = config_util.NewBasicAuthRoundTripper(cfg.BasicAuth.Username, cfg.BasicAuth.Password, "", cfg.BasicAuth.PasswordFile, rt) + username := config_util.NewInlineSecret(cfg.BasicAuth.Username) + var password config_util.SecretReader + if len(cfg.BasicAuth.PasswordFile) > 0 { + password = config_util.NewFileSecret(cfg.BasicAuth.PasswordFile) + } else { + password = config_util.NewInlineSecret(string(cfg.BasicAuth.Password)) + } + rt = config_util.NewBasicAuthRoundTripper(username, password, rt) } // Return a new configured RoundTripper. return rt, nil @@ -192,11 +199,18 @@ func NewRoundTripperFromConfig(cfg config_util.HTTPClientConfig, transportConfig return newRT(tlsConfig) } - return config_util.NewTLSRoundTripper(tlsConfig, config_util.TLSRoundTripperSettings{ - CAFile: cfg.TLSConfig.CAFile, - CertFile: cfg.TLSConfig.CertFile, - KeyFile: cfg.TLSConfig.KeyFile, - }, newRT) + rtConfig := config_util.TLSRoundTripperSettings{ + Cert: config_util.NewFileSecret(cfg.TLSConfig.CAFile), + } + if len(cfg.TLSConfig.CertFile) > 0 { + rtConfig.Cert = config_util.NewFileSecret(cfg.TLSConfig.CertFile) + } + + if len(cfg.TLSConfig.KeyFile) > 0 { + rtConfig.Key = config_util.NewFileSecret(cfg.TLSConfig.KeyFile) + } + + return config_util.NewTLSRoundTripper(tlsConfig, rtConfig, newRT) } // NewHTTPClient returns a new HTTP client. @@ -316,7 +330,7 @@ func (c HTTPFileSDConfig) convert() (file.SDConfig, error) { } type AddressProvider interface { - Resolve(context.Context, []string) error + Resolve(context.Context, []string, bool) error Addresses() []string } @@ -419,5 +433,5 @@ func (c *HTTPClient) Discover(ctx context.Context) { // Resolve refreshes and resolves the list of targets. func (c *HTTPClient) Resolve(ctx context.Context) error { - return c.provider.Resolve(ctx, append(c.fileSDCache.Addresses(), c.staticAddresses...)) + return c.provider.Resolve(ctx, append(c.fileSDCache.Addresses(), c.staticAddresses...), true) } diff --git a/pkg/clientconfig/http_test.go b/pkg/clientconfig/http_test.go new file mode 100644 index 0000000000..eb1296da9d --- /dev/null +++ b/pkg/clientconfig/http_test.go @@ -0,0 +1,95 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package clientconfig + +import ( + "testing" + + "github.com/efficientgo/core/testutil" +) + +func TestNewHTTPClientConfigFromYAML(t *testing.T) { + for _, tc := range []struct { + desc string + cfg HTTPClientConfig + err bool + }{ + { + desc: "empty string", + cfg: HTTPClientConfig{}, + err: false, + }, + { + desc: "missing CA file", + cfg: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: "xxx", + }, + }, + err: true, + }, + { + desc: "invalid CA file", + cfg: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: "testdata/invalid.pem", + }, + }, + err: true, + }, + { + desc: "valid CA file", + cfg: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: "testdata/tls-ca-chain.pem", + }, + }, + err: false, + }, + { + desc: "invalid cert file", + cfg: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: "testdata/tls-ca-chain.pem", + CertFile: "testdata/invalid.pem", + KeyFile: "testdata/self-signed-client.key", + }, + }, + err: true, + }, + { + desc: "invalid key file", + cfg: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: "testdata/tls-ca-chain.pem", + CertFile: "testdata/self-signed-client.crt", + KeyFile: "testdata/invalid.pem", + }, + }, + err: true, + }, + { + desc: "valid CA, cert and key files", + cfg: HTTPClientConfig{ + TLSConfig: TLSConfig{ + CAFile: "testdata/tls-ca-chain.pem", + CertFile: "testdata/self-signed-client.crt", + KeyFile: "testdata/self-signed-client.key", + }, + }, + err: false, + }, + } { + t.Run(tc.desc, func(t *testing.T) { + _, err := NewHTTPClient(tc.cfg, "") + if tc.err { + t.Logf("err: %v", err) + testutil.NotOk(t, err) + return + } + + testutil.Ok(t, err) + }) + } +} diff --git a/pkg/clientconfig/testdata/invalid.pem b/pkg/clientconfig/testdata/invalid.pem new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pkg/clientconfig/testdata/self-signed-client.crt b/pkg/clientconfig/testdata/self-signed-client.crt new file mode 100644 index 0000000000..a0a5cdc6ac --- /dev/null +++ b/pkg/clientconfig/testdata/self-signed-client.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFLjCCAxagAwIBAgIRAMMSh5NoexSCjSvDRf1fpgUwDQYJKoZIhvcNAQELBQAw +NjELMAkGA1UEBhMCVVMxEzARBgNVBAoTClByb21ldGhldXMxEjAQBgNVBAMTCWxv +Y2FsaG9zdDAgFw0yMjA3MDgwOTE1MDlaGA8yMDcyMDYyNTA5MTUwOVowNjELMAkG +A1UEBhMCVVMxEzARBgNVBAoTClByb21ldGhldXMxEjAQBgNVBAMTCWxvY2FsaG9z +dDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALtrXxnHr7eUM7Xh7awY +LwompmuznbTa/8+OsihSaelUN6RDsAdm7eOMA7KMqZB5NOfeDqEqMIUoaoQ1gzIm +0BJ4dCgi99SnA8b0MjAGqUpRJ3gLLSXsPa5647gxUSP5zQ0hWMMgGaw4rJ9LDOtU +z2S8dtqKTHrXl34mpdsLrZyLXwyz8UJ83Jq2Ngx4cApZrbs+g1XlMRV8Vh89Z2bk +bbKmDYmIOhTeE1wLdrZ/XecEOvkGZcj3bWiO/yTnP8mTER2hTvSxUrpyHn/55LkU +8PR6wCO7hntZ9LLWxg85XTRdWL7cIyjgJgfL9+hVQQyNEjWC2+LTq1QExqa+IxoH +iL4xX/1y+6o1W5XKLf/uplgaWuSK+mjQeqc387DwYbj61QWOjCoaJA1wl6RHuGGV +6ygpdAO1l8o+2U8nuULHW5lx+1BtMG5ytAXy9dWPercs5L8gh1IRNCVXWKsQCCWg +iG67nErFV5iRFLuAIX7ixLKJ5MGp/fVKUI9V1EViM2GUU46PVAPhhlZ1qcygjbZ5 +CelBnQ/XvGof5b4zm4eEgCc0ZkqsQDeS5jPjTtES8/y5WEKqbyijmvx2P40nuO/d +aTxNretMwaptWzu+WXHih0WG2Sq85m41070xsIMEwlqSfdiOOPdax6393NJgkdM7 +5NKC3+pzcHK1S1+x/Guawv0NAgMBAAGjNTAzMA4GA1UdDwEB/wQEAwIFIDATBgNV +HSUEDDAKBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IC +AQBTLnU8jFCmYpPUBOqj/xzBqokiQK92axG/h/3JgB7fFSLzUCV3NtvwBVCU28rA +wHwBYPjmGhi1vyHha/hb6V2WMPt0jhMRpNxCf16dAMoyIoWNas88vU2Mef90Chfj +8e6wLtzqAquX/ruwIfsOMnbcSGuh+y54DspCXgsTZ9cnCI2lnQroXZi4WUqi3Enj +mFPpVc+mMlffGW6LISo3ehRLA7k3/01yJhqzpTQw44k9ZfJ7VXZTRJKJsaqeljzV +VfzDbDfW8ftbZ8IWQGAOQfTa23aHIYcvJfvyxpfQRyrwRxjGytLHoOH/G+1TZuOt +KBJ2Xdi9qrr+Wep4eNJm2cTBd1Fpr0hWZ9K27BwwYdZZF8Eu8eP8hSeRmA4PqzAj +HauCl8PgWJIWzMloXVZaGxiYX7sGVs79m/Yl9A6+p8RTpK7DVB9+sDIiD2bhiZqL +i9YWM8aD2cR20t2ZkuBBPlVTOouF/WotOWrLhT4J+SngkdmLkAjP/5jPFvpTfeGi +THyAmp4gigwaM0nIZskPcPCbkk+zFYPToyS49ZJwQMzqK2hkjyQ9LyzUdo9vlDjL +8lFjlUZzqaR0DF3pbf8fs5/16gPurR65SU/ebOs+uxZLYJrP2zKmeISE+q4AMudc +rQ0Z6KmGUiXnIvpB105UJ7jlXCxbsruc8gRTbjkgW7yoXg== +-----END CERTIFICATE----- diff --git a/pkg/clientconfig/testdata/self-signed-client.key b/pkg/clientconfig/testdata/self-signed-client.key new file mode 100644 index 0000000000..4e4b2c2eaf --- /dev/null +++ b/pkg/clientconfig/testdata/self-signed-client.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQC7a18Zx6+3lDO1 +4e2sGC8KJqZrs5202v/PjrIoUmnpVDekQ7AHZu3jjAOyjKmQeTTn3g6hKjCFKGqE +NYMyJtASeHQoIvfUpwPG9DIwBqlKUSd4Cy0l7D2ueuO4MVEj+c0NIVjDIBmsOKyf +SwzrVM9kvHbaikx615d+JqXbC62ci18Ms/FCfNyatjYMeHAKWa27PoNV5TEVfFYf +PWdm5G2ypg2JiDoU3hNcC3a2f13nBDr5BmXI921ojv8k5z/JkxEdoU70sVK6ch5/ ++eS5FPD0esAju4Z7WfSy1sYPOV00XVi+3CMo4CYHy/foVUEMjRI1gtvi06tUBMam +viMaB4i+MV/9cvuqNVuVyi3/7qZYGlrkivpo0HqnN/Ow8GG4+tUFjowqGiQNcJek +R7hhlesoKXQDtZfKPtlPJ7lCx1uZcftQbTBucrQF8vXVj3q3LOS/IIdSETQlV1ir +EAgloIhuu5xKxVeYkRS7gCF+4sSyieTBqf31SlCPVdRFYjNhlFOOj1QD4YZWdanM +oI22eQnpQZ0P17xqH+W+M5uHhIAnNGZKrEA3kuYz407REvP8uVhCqm8oo5r8dj+N +J7jv3Wk8Ta3rTMGqbVs7vllx4odFhtkqvOZuNdO9MbCDBMJakn3Yjjj3Wset/dzS +YJHTO+TSgt/qc3BytUtfsfxrmsL9DQIDAQABAoICAAyGlIiIi/nc8cfKHbROuXYY +Ny8jhfq8WDRq+QUw3Ns3QbC8xVr5ShTXGrgoJnz9XMfSU2/5/dwoY1YKrYYAig9x +9XFpRN71eo8lauVCzLWmzth7Br1uGIE8vVNmGGIrI8Uo4WHJF24nK4JJ5cckl+fH +oLniXFIpbnqD4rnNAgFgXy3eKNWkuqmsW9hhhDts2uuUtfpbovgooyjbVbnOsnYq +GuWCMT+LyAdyzLBNutzhr39NKihQQQOn6u1wdxbluVMdoMVBxKGpVth+vwaPm7r7 +KTQ6KDa+QFhjekEyOERzqKa417C3qlMDEsJ4UCyikQD6ie+S7fRjjVM/ieEHd+AA +66CbJ8u3yfXxaicn+SPCeHVKd4GKmJgsg1KDSSg0+w5JWwmAiCJjEydX2HOdx2ys +SV2C4o+gxhA48U8ZgGTVoom0OgouQ7rnMd6n3juBDq2/Xp1FeDcE39yEffN7t4XN +vHfD7Hjp5capxVyEnpzu0tTVf8KP00NJKtS6I7d8IavUBCgFiJZFXJWdsbhgSsg9 +UdypUMd6rW81VaaKvi3JSjWwFpmUVAhr3hFNyQB9+2rxvDCWhUqFKWqjWdPfMgxx +qO6eam1S22vrZcyJVkfTzArFQd0J/41Ak0yErLJKLTDEYaBRxFPV0ujWskrmU96c +f+m4/k7p3sD8KooXfrERAoIBAQDWSmsFzSOugShur9phJV162XrtbOnV7n1Ko0Vu +U/ftohC5FNq0kHxAkY4kGMz2QHdJnqpQoJaCK8pJ+8nA1Osutt31tS3YrOotlNwk +KsFSiy+i9xf4NcOr9xKoSEstFPJeM650xPfVP1p4sq87BB2Z3uWfLtWnRxTJnpA2 +nwwtdrK5fO3pZnVlWQ4akqbndCjUWURXVOVxDHCyDdwoiz3BpGmVV6jCYanC3e3S +E7/OlRLJfRAXoCEbzFsQpsOYncaEG7cAz9pBBXA6VVyEPlVyMG0GHs30W7aG5Bfp +IcbhacGyjdV5Wwx8WGun1pOHoclLX7pJ6jOXLobpUVH4FUNTAoIBAQDf5gX9aBqK +QxBYcqhZ0aby9K9ZAXSRr03drf4s+TXSU7rUdBqV4BRj1cjQLB6pxpo2ryLoHhkf +tLVRnEWpRgSlfu7qSYxU8rNUacAKAPnebjQxU6NMVzFx7zDQz4TJT2StsxoSIw+l +O4MwWDvIxHcpjIrl1eZh79BSzrq5dsf3vrPCM+Xxivdkx82WJqiVX/LrY3l9R+kC +ud1b3O5vFdhpo8e0sygCdF0+sC0jwE82SCjMMGHMZWd74rmkuHFpJ1xSQf9/jRCf +yKhITI/su21FS4rn1rApWpzAvhfhV7HqnwWzFTtmLeGsI+yW4fb1j6oK7t/rVZ+p +lnwISXpOPBIfAoIBADnMttNIwsAV7F72pdOgLXeuY37Y6rWeb0MLiPW6RlxdY19Y +pakgc7NCz3EjE120g7hiyJOYzR/tSdHszT1q8MiX4ISeyu/vq/aBeWNz+NMX4dB2 +D4wOjGm86dZkMYrGZJ1OGVc7rZFiVjfKEoO7l3Rib9Mg4dYN0SiU0Vc6TSGSK6Dm +dpGG5lFg1PIL7mLtrPmh3lIj/wMgFOGh5Wk2LYEmpKf4jfdoOk7qZ3RLiWfiQ7// +MLD+qw+BbmquYIGwxNPrWdApQDhbjCrfzWWKHqf/Mdj9xBWOC0yVB3IFf0xbpzhP +E255RYPgoaESupZR6CahenDnb+TuUstp+M8OhSsCggEBANw/9gJ65yi9ohWv7MY2 +g+maI+gFk3tAnPOGFnR9TqGxdidKc2CeBtDS2/FUhXFzif5jOI5oFUToSjmW5bwH +wchfXn0gjqh9+0T9pkjw/tv9QuCHKyuM1noC1t2CVliF/j8U4X+X9+sN6RakpWLx +SVuZAoXnbfNHqoHbFToei8W9Vi2jSf7bOlRsbGPZcZtHwLonp7pDBAeHeSbF5dNn +BPWehHTQjHolqBhjzHPP2NxIDcIXkg00b6Ehvoc4XXAYpSvR+pmp1gGorUo57pbt +JSe2kVVRDwgPOAYuuWUWFFH9zuiE6WKxnb7ts+4VKRAVHCwXIjTpjN+Rxj+MsIDH +fPcCggEBAIRgZPwB6eI+rvYOPUGSeU681O+8/ZgjyAi8HSOk3dCc3J2fX31m/GsR +xM+FExbGYJ3BfdgB9YbLSI8eY7weJRodm0FoCuHePu81z4xj9yEi5hBodXhhDjQM +/xbgsSWeotQ+5lTmc5hgve1hl+3t09qNttHaELWASD+0ixBC6A6J4GB68ZKRIunW ++ZGiEvrNey6Uunf7T/Wgc+VDcA3HsniaY2yTZY/jWsmDxt/BAwUaQrNwAbHvm/1P +J04mvCreWfOITe7CURcLq4FMGzsCEXtdQ77/uJllew1Uv2Yn2WFUiqVxH+UicR1P +vOJ7/LvbOa8BlIMsprB2rz3PDSUSaIw= +-----END PRIVATE KEY----- diff --git a/pkg/clientconfig/testdata/tls-ca-chain.pem b/pkg/clientconfig/testdata/tls-ca-chain.pem new file mode 100644 index 0000000000..b67023a7d1 --- /dev/null +++ b/pkg/clientconfig/testdata/tls-ca-chain.pem @@ -0,0 +1,67 @@ +-----BEGIN CERTIFICATE----- +MIIF1DCCA7ygAwIBAgIRAMMSh5NoexSCjSvDRf1fpgIwDQYJKoZIhvcNAQELBQAw +ajELMAkGA1UEBhMCVVMxEzARBgNVBAoTClByb21ldGhldXMxKTAnBgNVBAsTIFBy +b21ldGhldXMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRswGQYDVQQDExJQcm9tZXRo +ZXVzIFJvb3QgQ0EwIBcNMjIwNzA4MDkxNTA2WhgPMjA3MjA2MjUwOTE1MDZaMGkx +CzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpQcm9tZXRoZXVzMSkwJwYDVQQLEyBQcm9t +ZXRoZXVzIENlcnRpZmljYXRlIEF1dGhvcml0eTEaMBgGA1UEAxMRUHJvbWV0aGV1 +cyBUTFMgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXtUbZhHR2 +xElyGJ+BwcZh4hm4dh1OhlJ6g98H2rEOK6bBxeO5YZnthfCnHI6WYN270ylusUc6 +JVkuU/1PO7NLYsl1D4ZIrRKQBWfg88BYrDO38HUkrm4aohlpT0+f7SiA7eRl1Mb5 +x6fi5BAVE5wnQJTE8VPBU+lXJB+SfZEixu+o1PlxVAdMYPAu1Yijakr1lDuZex+/ +j/700mihSAcwOvJ/+p4u2WNj0CMvQWiV5+VBZYrfpRN4/201FoyWILIv3HLq5OKp +Bpl/TvJ4J8oG1Cbzjm52qLgUOvHkAJ0I04DxWWywHF0VRumwLSqae0xo+KPPijj7 +bdnCx+vy37PbFOghzKzSIbPuccfKivVpChgy9n0kkgQhm9cgFE5SBuO6jfRwto0g +drSOMIzyXELDG0h0nB2gsPUHjD/OD1DT0VsW/9xXOPBfVgtPFn5LoZ8ninAFmk2r +ZiRJhCXhh+Rlw2F/s2STP66RnUGVdfP2syV+UlgJlE7EPE8cDbyfQqg7FTflq+t+ +HgXFCAkJ4S34+/qCbGv3DlbnC1lq+FiVwexm1TcfL/lYfhPr/J6VoeFZw4bjTPNa +jUILpsXv6IQzgPfCBxeZC6dDkK1D0cEXAqRRYKEFxdLnMjBcUZlWUV9uTuk01fDc +58bmlHt5sEqhcdUqHrR5PdoWJVOSbFwYBwIDAQABo3QwcjAOBgNVHQ8BAf8EBAMC +AqQwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTG +mh4eYNPmKKXi3dSJIs18ivSv8zAfBgNVHSMEGDAWgBRJPrEOm2ZrMgr9AFTz9LZy +0fDNNjANBgkqhkiG9w0BAQsFAAOCAgEAoc0OImcyyKSbVK63QA8VmD2o9Xr7abxX +o+f+QXWDqKAlNDAuXLYBjHMCc9YFsxXa9XkuKZeIxzop4h9iGG+fxMVPTx3T0gTm +MAuHcPka10z4Gy6ZxLzDmxJPkJ46b1n0K2fsv9XshzsHERz3VavwHXbC5mBo1CwI +6xLLtTWMuJdoyt0261D7Dat1JAFIWm2j+kxGvyIP0gNtRsUKOFA22Tlt42sEYnXa +7wmY7b15rndG69Xg9ZiVI5Mb/10gDJQcym23PXRn+JEgssE+WcYhll8f/LRmD49v +ZlBBD1dVoc9JyrgT+An+2Z8lE6wCSPqWSwhzvBW4dyB/u7Jn23dlV1SwJR8x/IaW +j/DhCELNqD6cSlRK3yjE/a2/iK0F6pNrVgKDY+/9uwFxwkjIRwqfcFtT6YpZ33mg +kSdTTbYpeg3XkLYZayE3ntzEhooyQdrJR6YyFVwsgcBCkeLrEbC7y/AG1MQEdKsZ +i3q730vztGQBR1ymPwgbB6qzGOXhmnhJHnQjeP2CJWnzDeOh2Vs4CxLAQZJ/dhYd +qrbYPAT8FJkp2PvoJP8zpmD7a8QC+6Gr17kl9OupPQrIIfxCXYZKDdGOlkDSUC16 +6y0E1WZnI+LVbQB1M584lB2/8jU4xqMqUPfoIcbjkjih9nvVA6t547527MeeTvXT +0ig2QvMFWMw= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIFtDCCA5ygAwIBAgIRAMMSh5NoexSCjSvDRf1fpgEwDQYJKoZIhvcNAQELBQAw +ajELMAkGA1UEBhMCVVMxEzARBgNVBAoTClByb21ldGhldXMxKTAnBgNVBAsTIFBy +b21ldGhldXMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRswGQYDVQQDExJQcm9tZXRo +ZXVzIFJvb3QgQ0EwIBcNMjIwNzA4MDkxNTA0WhgPMjA3MjA2MjUwOTE1MDRaMGox +CzAJBgNVBAYTAlVTMRMwEQYDVQQKEwpQcm9tZXRoZXVzMSkwJwYDVQQLEyBQcm9t +ZXRoZXVzIENlcnRpZmljYXRlIEF1dGhvcml0eTEbMBkGA1UEAxMSUHJvbWV0aGV1 +cyBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArkzRPi21 +E299vXw4FBbMfCXI258SxvvjRVRuKdAHLOBpEEqkYH6r6ScbZaisBFtIePv4ddKl +rmv+nDwN84/KS54OOtw1cWD4AnDB0kL3B0pWXjTS1F/u57hRLxM6Ta0UubKbta/h +WqSOR/fAA5sgcl+JbbR61QWVeYYXg9bM8YGTwQMeJod26tIUeX/Reo9BHuiW4jPb +pvVf7rsOs8E2cGwfYjZu6Zj2qcCxQ/ivCpopKFLNlaKko/KlGDGz9KxK5X3ik+sE +fPK9LzLC0k2RLGc3EmcMkdyqE3VNih9nV9SalAXN5yBdYaWWjJXykty7ilU32MBF +yO4myL48vif2K68pD/CFhG8YmIOud3woMm1IYS9xlsYKf7+f5CNlxqz+eSoOGhcG +dSDNft3h5nuq9J/qb2rIgWMSc2puFNRsx+fis0kS5GvjVadR0lxtArbrNm4S+F22 +EjGxeBF5VIWiu31uppbdASIw6DTKcrSVVoWxq+Fk3OOB+7q+rornosop9a/omXGH +0cTmgarjJtMqa0TEQiUPQPPnmpC1joeC7/kh7aks93wfHtY73uAVnTjLGTOwlr50 +CgRShcRoLLN049V93l46AFHU/4HWns8dqgdcdGnvIdUCFik916pKDSvEc/DfMLGh +H6w9Xlg4+2LgCyG2/FBEMTj+bLoraydzyaECAwEAAaNTMFEwDgYDVR0PAQH/BAQD +AgKkMA8GA1UdJQQIMAYGBFUdJQAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +ST6xDptmazIK/QBU8/S2ctHwzTYwDQYJKoZIhvcNAQELBQADggIBAHM79R/uQwQX +vsBDfKyBXWFlrhHAgX8XAwMKHjstpQYCcJoiGLRJaMMjxj31T1tylqPdcxz88THN +uj9kVFYMo1GU5K9E9lq0LoWQBmX2R7/RgxWqB7FNS+S0xfGyeUb3YPVPI1yhtsKa +6mCtTuCVgsgs/hTa+umjtffxj7l+IQxD8Fq0RFBae+S0v5mjVC2sUVd6usqVt7F6 +LUVuYShyAI705guIV9nkz8ZyLzUBJnQAJ8g6DU+nLmdizigUG+JoD/hBbK2hvcjX +SL7JLAhYRI4kzWcYR0GUfDf2knFEWNhU8gCPnw70FHMD9QC3NKkQsPvyQRyJh99+ +ipwUFbGJJRYWjFBbUxlqZNqBg6+ylZNFGEnG42u2KvPXjgPdivlQWkrX6nG0ayyl +rYrvi0FawP3OBpCrhYhqsqkA2m+5L2Pl+J2SsDv4qmPB6fh7K0YDVB37AZSG+nfL +oXXpUtwfc9tR71S7GmgkcqYOkHfSzl7ecxXtE2xyl3zhkUPR9YcG+rQhXRRp0lxF +kR0EtGOGuvXMCQ/vBVPNEDS3jdceqIrIRI1yPUdhFkF7lrLsfFULllOt6qQWnhn2 +A2ObxHToohwuyri/v8QhqNI2Bg0jJHcAJi8I8taToAstCWrtn+WXyfj/QknAik47 +aOK9l5wSyyqPfkHybKvT6z9pqWUchJsz +-----END CERTIFICATE----- diff --git a/pkg/compact/clean_test.go b/pkg/compact/clean_test.go index cd6135b702..580e151558 100644 --- a/pkg/compact/clean_test.go +++ b/pkg/compact/clean_test.go @@ -25,6 +25,8 @@ import ( ) func TestBestEffortCleanAbortedPartialUploads(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() diff --git a/pkg/compact/compact.go b/pkg/compact/compact.go index 7232119b0b..a20544b2f4 100644 --- a/pkg/compact/compact.go +++ b/pkg/compact/compact.go @@ -16,6 +16,7 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" + "github.com/golang/groupcache/singleflight" "github.com/oklog/ulid" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" @@ -60,6 +61,9 @@ type Syncer struct { metrics *SyncerMetrics duplicateBlocksFilter block.DeduplicateFilter ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter + syncMetasTimeout time.Duration + + g singleflight.Group } // SyncerMetrics holds metrics tracked by the syncer. This struct and its fields are exported @@ -98,15 +102,23 @@ func NewSyncerMetrics(reg prometheus.Registerer, blocksMarkedForDeletion, garbag // NewMetaSyncer returns a new Syncer for the given Bucket and directory. // Blocks must be at least as old as the sync delay for being considered. -func NewMetaSyncer(logger log.Logger, reg prometheus.Registerer, bkt objstore.Bucket, fetcher block.MetadataFetcher, duplicateBlocksFilter block.DeduplicateFilter, ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter, blocksMarkedForDeletion, garbageCollectedBlocks prometheus.Counter) (*Syncer, error) { - return NewMetaSyncerWithMetrics(logger, NewSyncerMetrics(reg, blocksMarkedForDeletion, garbageCollectedBlocks), bkt, fetcher, duplicateBlocksFilter, ignoreDeletionMarkFilter) +func NewMetaSyncer(logger log.Logger, reg prometheus.Registerer, bkt objstore.Bucket, fetcher block.MetadataFetcher, duplicateBlocksFilter block.DeduplicateFilter, ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter, blocksMarkedForDeletion, garbageCollectedBlocks prometheus.Counter, syncMetasTimeout time.Duration) (*Syncer, error) { + return NewMetaSyncerWithMetrics(logger, + NewSyncerMetrics(reg, blocksMarkedForDeletion, garbageCollectedBlocks), + bkt, + fetcher, + duplicateBlocksFilter, + ignoreDeletionMarkFilter, + syncMetasTimeout, + ) } -func NewMetaSyncerWithMetrics(logger log.Logger, metrics *SyncerMetrics, bkt objstore.Bucket, fetcher block.MetadataFetcher, duplicateBlocksFilter block.DeduplicateFilter, ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter) (*Syncer, error) { +func NewMetaSyncerWithMetrics(logger log.Logger, metrics *SyncerMetrics, bkt objstore.Bucket, fetcher block.MetadataFetcher, duplicateBlocksFilter block.DeduplicateFilter, ignoreDeletionMarkFilter *block.IgnoreDeletionMarkFilter, syncMetasTimeout time.Duration) (*Syncer, error) { if logger == nil { logger = log.NewNopLogger() } return &Syncer{ + syncMetasTimeout: syncMetasTimeout, logger: logger, bkt: bkt, fetcher: fetcher, @@ -135,15 +147,28 @@ func UntilNextDownsampling(m *metadata.Meta) (time.Duration, error) { // SyncMetas synchronizes local state of block metas with what we have in the bucket. func (s *Syncer) SyncMetas(ctx context.Context) error { - s.mtx.Lock() - defer s.mtx.Unlock() + var cancel func() = func() {} + if s.syncMetasTimeout > 0 { + ctx, cancel = context.WithTimeout(ctx, s.syncMetasTimeout) + } + defer cancel() - metas, partial, err := s.fetcher.Fetch(ctx) + type metasContainer struct { + metas map[ulid.ULID]*metadata.Meta + partial map[ulid.ULID]error + } + + container, err := s.g.Do("", func() (interface{}, error) { + metas, partial, err := s.fetcher.Fetch(ctx) + return metasContainer{metas, partial}, err + }) if err != nil { return retry(err) } - s.blocks = metas - s.partial = partial + s.mtx.Lock() + s.blocks = container.(metasContainer).metas + s.partial = container.(metasContainer).partial + s.mtx.Unlock() return nil } @@ -172,9 +197,6 @@ func (s *Syncer) Metas() map[ulid.ULID]*metadata.Meta { // block with a higher compaction level. // Call to SyncMetas function is required to populate duplicateIDs in duplicateBlocksFilter. func (s *Syncer) GarbageCollect(ctx context.Context) error { - s.mtx.Lock() - defer s.mtx.Unlock() - begin := time.Now() // Ignore filter exists before deduplicate filter. @@ -209,7 +231,9 @@ func (s *Syncer) GarbageCollect(ctx context.Context) error { // Immediately update our in-memory state so no further call to SyncMetas is needed // after running garbage collection. + s.mtx.Lock() delete(s.blocks, id) + s.mtx.Unlock() s.metrics.GarbageCollectedBlocks.Inc() } s.metrics.GarbageCollections.Inc() @@ -842,17 +866,19 @@ type Compactor interface { // only be called concurrently with results of Plan(). // Can optionally pass a list of already open blocks, // to avoid having to reopen them. - // When resulting Block has 0 samples + // Prometheus always return one or no block. The interface allows returning more than one + // block for downstream users to experiment with compactor. + // When one resulting Block has 0 samples // * No block is written. // * The source dirs are marked Deletable. - // * Returns empty ulid.ULID{}. - Compact(dest string, dirs []string, open []*tsdb.Block) (ulid.ULID, error) - CompactWithBlockPopulator(dest string, dirs []string, open []*tsdb.Block, blockPopulator tsdb.BlockPopulator) (ulid.ULID, error) + // * Block is not included in the result. + Compact(dest string, dirs []string, open []*tsdb.Block) ([]ulid.ULID, error) + CompactWithBlockPopulator(dest string, dirs []string, open []*tsdb.Block, blockPopulator tsdb.BlockPopulator) ([]ulid.ULID, error) } // Compact plans and runs a single compaction against the group. The compacted result // is uploaded into the bucket the blocks were retrieved from. -func (cg *Group) Compact(ctx context.Context, dir string, planner Planner, comp Compactor, blockDeletableChecker BlockDeletableChecker, compactionLifecycleCallback CompactionLifecycleCallback) (shouldRerun bool, compID ulid.ULID, rerr error) { +func (cg *Group) Compact(ctx context.Context, dir string, planner Planner, comp Compactor, blockDeletableChecker BlockDeletableChecker, compactionLifecycleCallback CompactionLifecycleCallback) (shouldRerun bool, compIDs []ulid.ULID, rerr error) { cg.compactionRunsStarted.Inc() subDir := filepath.Join(dir, cg.Key()) @@ -869,7 +895,7 @@ func (cg *Group) Compact(ctx context.Context, dir string, planner Planner, comp }() if err := os.MkdirAll(subDir, 0750); err != nil { - return false, ulid.ULID{}, errors.Wrap(err, "create compaction group dir") + return false, nil, errors.Wrap(err, "create compaction group dir") } defer func() { @@ -883,23 +909,23 @@ func (cg *Group) Compact(ctx context.Context, dir string, planner Planner, comp _, _ = sb.WriteString(",") } } - rerr = fmt.Errorf("paniced while compacting %s: %v", sb.String(), p) + rerr = fmt.Errorf("panicked while compacting %s: %v", sb.String(), p) } }() errChan := make(chan error, 1) err := tracing.DoInSpanWithErr(ctx, "compaction_group", func(ctx context.Context) (err error) { - shouldRerun, compID, err = cg.compact(ctx, subDir, planner, comp, blockDeletableChecker, compactionLifecycleCallback, errChan) + shouldRerun, compIDs, err = cg.compact(ctx, subDir, planner, comp, blockDeletableChecker, compactionLifecycleCallback, errChan) return err }, opentracing.Tags{"group.key": cg.Key()}) errChan <- err close(errChan) if err != nil { cg.compactionFailures.Inc() - return false, ulid.ULID{}, err + return false, nil, err } cg.compactionRunsCompleted.Inc() - return shouldRerun, compID, nil + return shouldRerun, compIDs, nil } // Issue347Error is a type wrapper for errors that should invoke repair process for broken block. @@ -1105,7 +1131,7 @@ func RepairIssue347(ctx context.Context, logger log.Logger, bkt objstore.Bucket, return nil } -func (cg *Group) compact(ctx context.Context, dir string, planner Planner, comp Compactor, blockDeletableChecker BlockDeletableChecker, compactionLifecycleCallback CompactionLifecycleCallback, errChan chan error) (shouldRerun bool, compID ulid.ULID, _ error) { +func (cg *Group) compact(ctx context.Context, dir string, planner Planner, comp Compactor, blockDeletableChecker BlockDeletableChecker, compactionLifecycleCallback CompactionLifecycleCallback, errChan chan error) (bool, []ulid.ULID, error) { cg.mtx.Lock() defer cg.mtx.Unlock() @@ -1115,7 +1141,7 @@ func (cg *Group) compact(ctx context.Context, dir string, planner Planner, comp // TODO(bwplotka): It would really nice if we could still check for other overlaps than replica. In fact this should be checked // in syncer itself. Otherwise with vertical compaction enabled we will sacrifice this important check. if !cg.enableVerticalCompaction { - return false, ulid.ULID{}, halt(errors.Wrap(err, "pre compaction overlap check")) + return false, nil, halt(errors.Wrap(err, "pre compaction overlap check")) } overlappingBlocks = true @@ -1126,11 +1152,11 @@ func (cg *Group) compact(ctx context.Context, dir string, planner Planner, comp toCompact, e = planner.Plan(ctx, cg.metasByMinTime, errChan, cg.extensions) return e }); err != nil { - return false, ulid.ULID{}, errors.Wrap(err, "plan compaction") + return false, nil, errors.Wrap(err, "plan compaction") } if len(toCompact) == 0 { // Nothing to do. - return false, ulid.ULID{}, nil + return false, nil, nil } level.Info(cg.logger).Log("msg", "compaction available and planned", "plan", fmt.Sprintf("%v", toCompact)) @@ -1140,7 +1166,7 @@ func (cg *Group) compact(ctx context.Context, dir string, planner Planner, comp begin := groupCompactionBegin if err := compactionLifecycleCallback.PreCompactionCallback(ctx, cg.logger, cg, toCompact); err != nil { - return false, ulid.ULID{}, errors.Wrapf(err, "failed to run pre compaction callback for plan: %s", fmt.Sprintf("%v", toCompact)) + return false, nil, errors.Wrapf(err, "failed to run pre compaction callback for plan: %s", fmt.Sprintf("%v", toCompact)) } level.Info(cg.logger).Log("msg", "finished running pre compaction callback; downloading blocks", "duration", time.Since(begin), "duration_ms", time.Since(begin).Milliseconds(), "plan", fmt.Sprintf("%v", toCompact)) @@ -1197,25 +1223,26 @@ func (cg *Group) compact(ctx context.Context, dir string, planner Planner, comp sourceBlockStr := fmt.Sprintf("%v", toCompactDirs) if err := g.Wait(); err != nil { - return false, ulid.ULID{}, err + return false, nil, err } level.Info(cg.logger).Log("msg", "downloaded and verified blocks; compacting blocks", "duration", time.Since(begin), "duration_ms", time.Since(begin).Milliseconds(), "plan", sourceBlockStr) begin = time.Now() + var compIDs []ulid.ULID if err := tracing.DoInSpanWithErr(ctx, "compaction", func(ctx context.Context) (e error) { populateBlockFunc, e := compactionLifecycleCallback.GetBlockPopulator(ctx, cg.logger, cg) if e != nil { return e } - compID, e = comp.CompactWithBlockPopulator(dir, toCompactDirs, nil, populateBlockFunc) + compIDs, e = comp.CompactWithBlockPopulator(dir, toCompactDirs, nil, populateBlockFunc) return e }); err != nil { - return false, ulid.ULID{}, halt(errors.Wrapf(err, "compact blocks %v", toCompactDirs)) + return false, nil, halt(errors.Wrapf(err, "compact blocks %v", toCompactDirs)) } - if compID == (ulid.ULID{}) { - // Prometheus compactor found that the compacted block would have no samples. - level.Info(cg.logger).Log("msg", "compacted block would have no samples, deleting source blocks", "blocks", sourceBlockStr) + if len(compIDs) == 0 { + // No compacted blocks means all compacted blocks are of no sample. + level.Info(cg.logger).Log("msg", "no compacted blocks, deleting source blocks", "blocks", sourceBlockStr) for _, meta := range toCompact { if meta.Stats.NumSamples == 0 { if err := cg.deleteBlock(meta.ULID, filepath.Join(dir, meta.ULID.String()), blockDeletableChecker); err != nil { @@ -1223,99 +1250,103 @@ func (cg *Group) compact(ctx context.Context, dir string, planner Planner, comp } } } - // Even though this block was empty, there may be more work to do. - return true, ulid.ULID{}, nil + // Even though no compacted blocks, there may be more work to do. + return true, nil, nil } cg.compactions.Inc() if overlappingBlocks { cg.verticalCompactions.Inc() } - level.Info(cg.logger).Log("msg", "compacted blocks", "new", compID, + compIDStrings := make([]string, 0, len(compIDs)) + for _, compID := range compIDs { + compIDStrings = append(compIDStrings, compID.String()) + } + compIDStrs := fmt.Sprintf("%v", compIDStrings) + level.Info(cg.logger).Log("msg", "compacted blocks", "new", compIDStrs, "duration", time.Since(begin), "duration_ms", time.Since(begin).Milliseconds(), "overlapping_blocks", overlappingBlocks, "blocks", sourceBlockStr) - bdir := filepath.Join(dir, compID.String()) - index := filepath.Join(bdir, block.IndexFilename) - - if err := os.Remove(filepath.Join(bdir, "tombstones")); err != nil { - return false, ulid.ULID{}, errors.Wrap(err, "remove tombstones") - } + for _, compID := range compIDs { + bdir := filepath.Join(dir, compID.String()) + index := filepath.Join(bdir, block.IndexFilename) - newMeta, err := metadata.ReadFromDir(bdir) - if err != nil { - return false, ulid.ULID{}, errors.Wrap(err, "read new meta") - } + if err := os.Remove(filepath.Join(bdir, "tombstones")); err != nil { + return false, nil, errors.Wrap(err, "remove tombstones") + } - var stats block.HealthStats - // Ensure the output block is valid. - err = tracing.DoInSpanWithErr(ctx, "compaction_verify_index", func(ctx context.Context) error { - stats, err = block.GatherIndexHealthStats(ctx, cg.logger, index, newMeta.MinTime, newMeta.MaxTime) + newMeta, err := metadata.ReadFromDir(bdir) if err != nil { - return err + return false, nil, errors.Wrap(err, "read new meta") } - return stats.AnyErr() - }) - if !cg.acceptMalformedIndex && err != nil { - return false, ulid.ULID{}, halt(errors.Wrapf(err, "invalid result block %s", bdir)) - } - thanosMeta := metadata.Thanos{ - Labels: cg.labels.Map(), - Downsample: metadata.ThanosDownsample{Resolution: cg.resolution}, - Source: metadata.CompactorSource, - SegmentFiles: block.GetSegmentFiles(bdir), - Extensions: cg.extensions, - } - if stats.ChunkMaxSize > 0 { - thanosMeta.IndexStats.ChunkMaxSize = stats.ChunkMaxSize - } - if stats.SeriesMaxSize > 0 { - thanosMeta.IndexStats.SeriesMaxSize = stats.SeriesMaxSize - } - newMeta, err = metadata.InjectThanos(cg.logger, bdir, thanosMeta, nil) - if err != nil { - return false, ulid.ULID{}, errors.Wrapf(err, "failed to finalize the block %s", bdir) - } + var stats block.HealthStats + // Ensure the output block is valid. + err = tracing.DoInSpanWithErr(ctx, "compaction_verify_index", func(ctx context.Context) error { + stats, err = block.GatherIndexHealthStats(ctx, cg.logger, index, newMeta.MinTime, newMeta.MaxTime) + if err != nil { + return err + } + return stats.AnyErr() + }) + if !cg.acceptMalformedIndex && err != nil { + return false, nil, halt(errors.Wrapf(err, "invalid result block %s", bdir)) + } - // Ensure the output block is not overlapping with anything else, - // unless vertical compaction is enabled. - if !cg.enableVerticalCompaction { - if err := cg.areBlocksOverlapping(newMeta, toCompact...); err != nil { - return false, ulid.ULID{}, halt(errors.Wrapf(err, "resulted compacted block %s overlaps with something", bdir)) + thanosMeta := metadata.Thanos{ + Labels: cg.labels.Map(), + Downsample: metadata.ThanosDownsample{Resolution: cg.resolution}, + Source: metadata.CompactorSource, + SegmentFiles: block.GetSegmentFiles(bdir), + Extensions: cg.extensions, + } + if stats.ChunkMaxSize > 0 { + thanosMeta.IndexStats.ChunkMaxSize = stats.ChunkMaxSize + } + if stats.SeriesMaxSize > 0 { + thanosMeta.IndexStats.SeriesMaxSize = stats.SeriesMaxSize + } + newMeta, err = metadata.InjectThanos(cg.logger, bdir, thanosMeta, nil) + if err != nil { + return false, nil, errors.Wrapf(err, "failed to finalize the block %s", bdir) + } + // Ensure the output block is not overlapping with anything else, + // unless vertical compaction is enabled. + if !cg.enableVerticalCompaction { + if err := cg.areBlocksOverlapping(newMeta, toCompact...); err != nil { + return false, nil, halt(errors.Wrapf(err, "resulted compacted block %s overlaps with something", bdir)) + } } - } - begin = time.Now() + begin = time.Now() - err = tracing.DoInSpanWithErr(ctx, "compaction_block_upload", func(ctx context.Context) error { - return block.Upload(ctx, cg.logger, cg.bkt, bdir, cg.hashFunc, objstore.WithUploadConcurrency(cg.blockFilesConcurrency)) - }) - if err != nil { - return false, ulid.ULID{}, retry(errors.Wrapf(err, "upload of %s failed", compID)) + err = tracing.DoInSpanWithErr(ctx, "compaction_block_upload", func(ctx context.Context) error { + return block.Upload(ctx, cg.logger, cg.bkt, bdir, cg.hashFunc, objstore.WithUploadConcurrency(cg.blockFilesConcurrency)) + }) + if err != nil { + return false, nil, retry(errors.Wrapf(err, "upload of %s failed", compID)) + } + level.Info(cg.logger).Log("msg", "uploaded block", "result_block", compID, "duration", time.Since(begin), "duration_ms", time.Since(begin).Milliseconds()) + level.Info(cg.logger).Log("msg", "running post compaction callback", "result_block", compID) + if err := compactionLifecycleCallback.PostCompactionCallback(ctx, cg.logger, cg, compID); err != nil { + return false, nil, retry(errors.Wrapf(err, "failed to run post compaction callback for result block %s", compID)) + } + level.Info(cg.logger).Log("msg", "finished running post compaction callback", "result_block", compID) } - level.Info(cg.logger).Log("msg", "uploaded block", "result_block", compID, "duration", time.Since(begin), "duration_ms", time.Since(begin).Milliseconds()) // Mark for deletion the blocks we just compacted from the group and bucket so they do not get included // into the next planning cycle. // Eventually the block we just uploaded should get synced into the group again (including sync-delay). for _, meta := range toCompact { - err = tracing.DoInSpanWithErr(ctx, "compaction_block_delete", func(ctx context.Context) error { + if err := tracing.DoInSpanWithErr(ctx, "compaction_block_delete", func(ctx context.Context) error { return cg.deleteBlock(meta.ULID, filepath.Join(dir, meta.ULID.String()), blockDeletableChecker) - }, opentracing.Tags{"block.id": meta.ULID}) - if err != nil { - return false, ulid.ULID{}, retry(errors.Wrapf(err, "mark old block for deletion from bucket")) + }, opentracing.Tags{"block.id": meta.ULID}); err != nil { + return false, nil, retry(errors.Wrapf(err, "mark old block for deletion from bucket")) } cg.groupGarbageCollectedBlocks.Inc() } - level.Info(cg.logger).Log("msg", "running post compaction callback", "result_block", compID) - if err := compactionLifecycleCallback.PostCompactionCallback(ctx, cg.logger, cg, compID); err != nil { - return false, ulid.ULID{}, retry(errors.Wrapf(err, "failed to run post compaction callback for result block %s", compID)) - } - level.Info(cg.logger).Log("msg", "finished running post compaction callback", "result_block", compID) - level.Info(cg.logger).Log("msg", "finished compacting blocks", "duration", time.Since(groupCompactionBegin), - "duration_ms", time.Since(groupCompactionBegin).Milliseconds(), "result_block", compID, "source_blocks", sourceBlockStr) - return true, compID, nil + "duration_ms", time.Since(groupCompactionBegin).Milliseconds(), "result_blocks", compIDStrs, "source_blocks", sourceBlockStr) + return true, compIDs, nil } func (cg *Group) deleteBlock(id ulid.ULID, bdir string, blockDeletableChecker BlockDeletableChecker) error { diff --git a/pkg/compact/compact_e2e_test.go b/pkg/compact/compact_e2e_test.go index 3d96a444b9..c0232547ca 100644 --- a/pkg/compact/compact_e2e_test.go +++ b/pkg/compact/compact_e2e_test.go @@ -106,7 +106,7 @@ func TestSyncer_GarbageCollect_e2e(t *testing.T) { garbageCollectedBlocks := promauto.With(nil).NewCounter(prometheus.CounterOpts{}) blockMarkedForNoCompact := promauto.With(nil).NewCounter(prometheus.CounterOpts{}) ignoreDeletionMarkFilter := block.NewIgnoreDeletionMarkFilter(nil, nil, 48*time.Hour, fetcherConcurrency) - sy, err := NewMetaSyncer(nil, nil, bkt, metaFetcher, duplicateBlocksFilter, ignoreDeletionMarkFilter, blocksMarkedForDeletion, garbageCollectedBlocks) + sy, err := NewMetaSyncer(nil, nil, bkt, metaFetcher, duplicateBlocksFilter, ignoreDeletionMarkFilter, blocksMarkedForDeletion, garbageCollectedBlocks, 0) testutil.Ok(t, err) // Do one initial synchronization with the bucket. @@ -209,7 +209,7 @@ func testGroupCompactE2e(t *testing.T, mergeFunc storage.VerticalChunkSeriesMerg blocksMarkedForDeletion := promauto.With(nil).NewCounter(prometheus.CounterOpts{}) blocksMaredForNoCompact := promauto.With(nil).NewCounter(prometheus.CounterOpts{}) garbageCollectedBlocks := promauto.With(nil).NewCounter(prometheus.CounterOpts{}) - sy, err := NewMetaSyncer(nil, nil, bkt, metaFetcher, duplicateBlocksFilter, ignoreDeletionMarkFilter, blocksMarkedForDeletion, garbageCollectedBlocks) + sy, err := NewMetaSyncer(nil, nil, bkt, metaFetcher, duplicateBlocksFilter, ignoreDeletionMarkFilter, blocksMarkedForDeletion, garbageCollectedBlocks, 0) testutil.Ok(t, err) comp, err := tsdb.NewLeveledCompactor(ctx, reg, logger, []int64{1000, 3000}, nil, mergeFunc) @@ -258,7 +258,7 @@ func testGroupCompactE2e(t *testing.T, mergeFunc storage.VerticalChunkSeriesMerg }, // Mix order to make sure compactor is able to deduct min time / max time. // Currently TSDB does not produces empty blocks (see: https://github.com/prometheus/tsdb/pull/374). However before v2.7.0 it was - // so we still want to mimick this case as close as possible. + // so we still want to mimic this case as close as possible. { mint: 1000, maxt: 2000, extLset: extLabels, res: 124, // Empty block. @@ -493,7 +493,7 @@ func TestGarbageCollectDoesntCreateEmptyBlocksWithDeletionMarksOnly(t *testing.T }) testutil.Ok(t, err) - sy, err := NewMetaSyncer(nil, nil, bkt, metaFetcher, duplicateBlocksFilter, ignoreDeletionMarkFilter, blocksMarkedForDeletion, garbageCollectedBlocks) + sy, err := NewMetaSyncer(nil, nil, bkt, metaFetcher, duplicateBlocksFilter, ignoreDeletionMarkFilter, blocksMarkedForDeletion, garbageCollectedBlocks, 0) testutil.Ok(t, err) // Do one initial synchronization with the bucket. diff --git a/pkg/compact/compact_test.go b/pkg/compact/compact_test.go index 1d3764907c..4505774651 100644 --- a/pkg/compact/compact_test.go +++ b/pkg/compact/compact_test.go @@ -32,6 +32,8 @@ import ( ) func TestHaltError(t *testing.T) { + t.Parallel() + err := errors.New("test") testutil.Assert(t, !IsHaltError(err), "halt error") @@ -46,6 +48,8 @@ func TestHaltError(t *testing.T) { } func TestHaltMultiError(t *testing.T) { + t.Parallel() + haltErr := halt(errors.New("halt error")) nonHaltErr := errors.New("not a halt error") @@ -59,6 +63,8 @@ func TestHaltMultiError(t *testing.T) { } func TestRetryMultiError(t *testing.T) { + t.Parallel() + retryErr := retry(errors.New("retry error")) nonRetryErr := errors.New("not a retry error") @@ -75,6 +81,8 @@ func TestRetryMultiError(t *testing.T) { } func TestRetryError(t *testing.T) { + t.Parallel() + err := errors.New("test") testutil.Assert(t, !IsRetryError(err), "retry error") @@ -92,6 +100,8 @@ func TestRetryError(t *testing.T) { } func TestGroupKey(t *testing.T) { + t.Parallel() + for _, tcase := range []struct { input metadata.Thanos expected string @@ -131,6 +141,8 @@ func TestGroupKey(t *testing.T) { } func TestGroupMaxMinTime(t *testing.T) { + t.Parallel() + g := &Group{ metasByMinTime: []*metadata.Meta{ {BlockMeta: tsdb.BlockMeta{MinTime: 0, MaxTime: 10}}, @@ -207,6 +219,8 @@ func createBlockMeta(id uint64, minTime, maxTime int64, labels map[string]string } func TestRetentionProgressCalculate(t *testing.T) { + t.Parallel() + logger := log.NewNopLogger() reg := prometheus.NewRegistry() @@ -328,6 +342,8 @@ func TestRetentionProgressCalculate(t *testing.T) { } func TestCompactProgressCalculate(t *testing.T) { + t.Parallel() + type planResult struct { compactionBlocks, compactionRuns float64 } @@ -433,6 +449,8 @@ func TestCompactProgressCalculate(t *testing.T) { } func TestDownsampleProgressCalculate(t *testing.T) { + t.Parallel() + reg := prometheus.NewRegistry() logger := log.NewNopLogger() @@ -532,6 +550,8 @@ func TestDownsampleProgressCalculate(t *testing.T) { } func TestNoMarkFilterAtomic(t *testing.T) { + t.Parallel() + ctx := context.TODO() logger := log.NewLogfmtLogger(io.Discard) diff --git a/pkg/compact/downsample/aggr.go b/pkg/compact/downsample/aggr.go index 7f16f5258d..7102829627 100644 --- a/pkg/compact/downsample/aggr.go +++ b/pkg/compact/downsample/aggr.go @@ -94,6 +94,10 @@ func (c AggrChunk) Get(t AggrType) (chunkenc.Chunk, error) { return chunkenc.FromData(chunkenc.Encoding(x[0]), x[1:]) } +func (c *AggrChunk) Reset(stream []byte) { + (*c) = stream +} + // AggrType represents an aggregation type. type AggrType uint8 diff --git a/pkg/compact/downsample/aggr_test.go b/pkg/compact/downsample/aggr_test.go index d2b44a461a..1db0ff9401 100644 --- a/pkg/compact/downsample/aggr_test.go +++ b/pkg/compact/downsample/aggr_test.go @@ -45,4 +45,16 @@ func TestAggrChunk(t *testing.T) { } } testutil.Equals(t, input, res) + + // Test reset + nc := &AggrChunk{} + nc.Reset(ac.Bytes()) + res = [5][]sample{} + for _, at := range []AggrType{AggrCount, AggrSum, AggrMin, AggrMax, AggrCounter} { + if c, err := nc.Get(at); err != ErrAggrNotExist { + testutil.Ok(t, err) + testutil.Ok(t, expandChunkIterator(c.Iterator(nil), &res[at])) + } + } + testutil.Equals(t, input, res) } diff --git a/pkg/compact/downsample/downsample.go b/pkg/compact/downsample/downsample.go index 6aa2b23dfe..46d590186e 100644 --- a/pkg/compact/downsample/downsample.go +++ b/pkg/compact/downsample/downsample.go @@ -149,7 +149,7 @@ func Downsample( // Raw and already downsampled data need different processing. if origMeta.Thanos.Downsample.Resolution == 0 { for _, c := range chks { - // TODO(bwplotka): We can optimze this further by using in WriteSeries iterators of each chunk instead of + // TODO(bwplotka): We can optimize this further by using in WriteSeries iterators of each chunk instead of // samples. Also ensure 120 sample limit, otherwise we have gigantic chunks. // https://github.com/thanos-io/thanos/issues/2542. if err := expandChunkIterator(c.Chunk.Iterator(reuseIt), &all); err != nil { diff --git a/pkg/compact/downsample/downsample_test.go b/pkg/compact/downsample/downsample_test.go index b2c5b888cc..fa1f7edc2d 100644 --- a/pkg/compact/downsample/downsample_test.go +++ b/pkg/compact/downsample/downsample_test.go @@ -23,17 +23,697 @@ import ( "github.com/prometheus/prometheus/tsdb/index" "github.com/prometheus/prometheus/tsdb/tombstones" "github.com/prometheus/prometheus/tsdb/tsdbutil" - "go.uber.org/goleak" "github.com/efficientgo/core/testutil" "github.com/thanos-io/thanos/pkg/block" "github.com/thanos-io/thanos/pkg/block/metadata" + "github.com/thanos-io/thanos/pkg/testutil/custom" "github.com/thanos-io/thanos/pkg/testutil/testiters" ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + custom.TolerantVerifyLeakMain(m) +} + +func TestDownsampleAndReadResultingData(t *testing.T) { + data := []sample{ + {t: 1688526018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526078213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688526138213, v: math.Float64frombits(4607156757263679111)}, + {t: 1688526198213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526438213, v: math.Float64frombits(4607105434191002523)}, + {t: 1688526498213, v: math.Float64frombits(4607143926495509974)}, + {t: 1688526558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526678213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526738213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526798213, v: math.Float64frombits(4607131022513257114)}, + {t: 1688526858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688526978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527038213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527098213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527158213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527398213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527458213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688527518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527638213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527818213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688527878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527938213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688527998213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528178213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528238213, v: math.Float64frombits(4607092603422833380)}, + {t: 1688528298213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528538213, v: math.Float64frombits(4607118264959171663)}, + {t: 1688528598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528778213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528838213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688528898213, v: math.Float64frombits(4607131022513257122)}, + {t: 1688528958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529078213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529138213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529198213, v: math.Float64frombits(4607118264959171672)}, + {t: 1688529258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529378213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529438213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529558213, v: math.Float64frombits(4607169588031848265)}, + {t: 1688529618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529678213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529738213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688529918213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688529978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530038213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530098213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530158213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530398213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530638213, v: math.Float64frombits(4607143926495509973)}, + {t: 1688530698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688530938213, v: math.Float64frombits(4607118264959171663)}, + {t: 1688530998213, v: math.Float64frombits(4607143926495509974)}, + {t: 1688531058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531178213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531238213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531298213, v: math.Float64frombits(4607156757263679111)}, + {t: 1688531358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531538213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531778213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531838213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531898213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688531958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532018213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688532078213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532198213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532378213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532438213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532678213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688532738213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688532798213, v: math.Float64frombits(4607143871584947194)}, + {t: 1688532858213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688532918213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688532978213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688533038213, v: math.Float64frombits(4607143871584947189)}, + {t: 1688533098213, v: math.Float64frombits(4607131022513257122)}, + {t: 1688533158213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533398213, v: math.Float64frombits(4607143926495509968)}, + {t: 1688533458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533638213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533938213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688533998213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534178213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534238213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534298213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688534538213, v: math.Float64frombits(4607131022513257117)}, + {t: 1688534598213, v: math.Float64frombits(4607156720656637259)}, + {t: 1688534658213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688534718213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688534778213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688534838213, v: math.Float64frombits(4607105214234976770)}, + {t: 1688534898213, v: math.Float64frombits(4607156720656637259)}, + {t: 1688534958213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688535018213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688535078213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688535138213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688535198213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688535258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688535318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688535378213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688535438213, v: math.Float64frombits(4607131095727340818)}, + {t: 1688535498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688535558213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688535618213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688535678213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688535738213, v: math.Float64frombits(4607156720656637259)}, + {t: 1688535798213, v: math.Float64frombits(4607143926495509973)}, + {t: 1688535858213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688535918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688535978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536038213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536098213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536158213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688536218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536398213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536638213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536818213, v: math.Float64frombits(4607169588031848266)}, + {t: 1688536878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536938213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688536998213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537178213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688537238213, v: math.Float64frombits(4607131095727340818)}, + {t: 1688537298213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537538213, v: math.Float64frombits(4607079772654664231)}, + {t: 1688537598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537838213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688537898213, v: math.Float64frombits(4607079772654664232)}, + {t: 1688537958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538078213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538138213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538198213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538378213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538438213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538678213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538738213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688538918213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688538978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539038213, v: math.Float64frombits(4607118173441567050)}, + {t: 1688539098213, v: math.Float64frombits(4607131022513257121)}, + {t: 1688539158213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688539218213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688539278213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688539338213, v: math.Float64frombits(4607143871584947195)}, + {t: 1688539398213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539638213, v: math.Float64frombits(4607105434191002518)}, + {t: 1688539758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539938213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688539998213, v: math.Float64frombits(4607118264959171665)}, + {t: 1688540058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540178213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540238213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540298213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540538213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540658213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688540718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688540778213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688540838213, v: math.Float64frombits(4607002531796356391)}, + {t: 1688540898213, v: math.Float64frombits(4607066611952456451)}, + {t: 1688540958213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688541018213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688541078213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688541138213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541198213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541378213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688541438213, v: math.Float64frombits(4607066777154806746)}, + {t: 1688541498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541678213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541738213, v: math.Float64frombits(4607015618813818502)}, + {t: 1688541798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688541978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542038213, v: math.Float64frombits(4607079772654664233)}, + {t: 1688542098213, v: math.Float64frombits(4607054111118325940)}, + {t: 1688542158213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688542218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542338213, v: math.Float64frombits(4607105434191002523)}, + {t: 1688542398213, v: math.Float64frombits(4607053928083116679)}, + {t: 1688542458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542578213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688542638213, v: math.Float64frombits(4607066777154806748)}, + {t: 1688542698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688542938213, v: math.Float64frombits(4607118173441567034)}, + {t: 1688542998213, v: math.Float64frombits(4607143871584947194)}, + {t: 1688543058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543178213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543238213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543298213, v: math.Float64frombits(4607131022513257122)}, + {t: 1688543358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543538213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543778213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543838213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543898213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688543958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544078213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544138213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544198213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544378213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544438213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544678213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688544738213, v: math.Float64frombits(4607092346807469995)}, + {t: 1688544798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688544978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688545038213, v: math.Float64frombits(4607066777154806751)}, + {t: 1688545098213, v: math.Float64frombits(4607066941886495085)}, + {t: 1688545158213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688545218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688545278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688545338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688545398213, v: math.Float64frombits(4607143926495509968)}, + {t: 1688545458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688545518213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688545578213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688545638213, v: math.Float64frombits(4607079772654664233)}, + {t: 1688545698213, v: math.Float64frombits(4607105434191002519)}, + {t: 1688545758213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688545818213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688545878213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688545938213, v: math.Float64frombits(4607092731182971622)}, + {t: 1688545998213, v: math.Float64frombits(4607118356216413265)}, + {t: 1688546058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688546118213, v: math.Float64frombits(4607169606283296587)}, + {t: 1688546178213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688546238213, v: math.Float64frombits(4607054293632809142)}, + {t: 1688546298213, v: math.Float64frombits(4607054293632809140)}, + {t: 1688546358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688546418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688546478213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688546538213, v: math.Float64frombits(4607067106149529966)}, + {t: 1688546598213, v: math.Float64frombits(4607079918666250791)}, + {t: 1688546658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688546718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688546778213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688546838213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688546898213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688546958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547018213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688547078213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688547138213, v: math.Float64frombits(4607092731182971626)}, + {t: 1688547198213, v: math.Float64frombits(4607092731182971619)}, + {t: 1688547258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547378213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547438213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547558213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688547618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547678213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547738213, v: math.Float64frombits(4607156793766575752)}, + {t: 1688547798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688547978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548098213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548158213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688548218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548398213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548578213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688548638213, v: math.Float64frombits(4607105434191002521)}, + {t: 1688548698213, v: math.Float64frombits(4607054111118325939)}, + {t: 1688548758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548938213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688548998213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549118213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688549178213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688549238213, v: math.Float64frombits(4607118356216413266)}, + {t: 1688549298213, v: math.Float64frombits(4607118356216413266)}, + {t: 1688549358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549538213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549598213, v: math.Float64frombits(4607092731182971623)}, + {t: 1688549658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549718213, v: math.Float64frombits(4607169606283296583)}, + {t: 1688549778213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549838213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549898213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688549958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550078213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550138213, v: math.Float64frombits(4607156793766575752)}, + {t: 1688550198213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550438213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550498213, v: math.Float64frombits(4607080064263031713)}, + {t: 1688550558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550678213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550738213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550858213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688550918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688550978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551038213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551098213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551158213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551398213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551638213, v: math.Float64frombits(4607067269945908499)}, + {t: 1688551698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688551938213, v: math.Float64frombits(4607118447214401342)}, + {t: 1688551998213, v: math.Float64frombits(4607092858580154923)}, + {t: 1688552058213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688552118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688552178213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688552238213, v: math.Float64frombits(4607105652897278138)}, + {t: 1688552298213, v: math.Float64frombits(4607105652897278140)}, + {t: 1688552358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688552418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688552478213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688552538213, v: math.Float64frombits(4607080064263031714)}, + {t: 1688552598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688552658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688552718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688552778213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688552838213, v: math.Float64frombits(4607028886994538873)}, + {t: 1688552898213, v: math.Float64frombits(4607092858580154926)}, + {t: 1688552958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553078213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553138213, v: math.Float64frombits(4607118447214401341)}, + {t: 1688553198213, v: math.Float64frombits(4607080064263031710)}, + {t: 1688553258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553378213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688553438213, v: math.Float64frombits(4607067269945908500)}, + {t: 1688553498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553678213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553738213, v: math.Float64frombits(4607092985615927779)}, + {t: 1688553798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688553978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554038213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554098213, v: math.Float64frombits(4607105761785083446)}, + {t: 1688554158213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554638213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688554998213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555298213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555538213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555778213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688555838213, v: math.Float64frombits(4607067269945908499)}, + {t: 1688555898213, v: math.Float64frombits(4607041681311662081)}, + {t: 1688555958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556078213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556138213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556198213, v: math.Float64frombits(4607067269945908504)}, + {t: 1688556258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556318213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556378213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556438213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556678213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556738213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688556978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557038213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557098213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557158213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557218213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688557278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557398213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557638213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688557938213, v: math.Float64frombits(4607092603422833381)}, + {t: 1688557998213, v: math.Float64frombits(4607079918666250794)}, + {t: 1688558058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558178213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558238213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558298213, v: math.Float64frombits(4607092475298186899)}, + {t: 1688558358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558418213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558538213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558778213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558838213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558898213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688558958213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688559018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559138213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559198213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559258213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559318213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688559378213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559438213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559498213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559558213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559618213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559678213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688559738213, v: math.Float64frombits(4607105543699692438)}, + {t: 1688559798213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559858213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559918213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688559978213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560038213, v: math.Float64frombits(4607054293632809136)}, + {t: 1688560098213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560158213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560218213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560278213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560338213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560398213, v: math.Float64frombits(4607092731182971621)}, + {t: 1688560458213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560518213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560578213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560638213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560698213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560758213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560818213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560878213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560938213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688560998213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561058213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561118213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561178213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561238213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561298213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561358213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561418213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688561478213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561538213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561598213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561658213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561718213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561778213, v: math.Float64frombits(4607182418800017408)}, + {t: 1688561838213, v: math.Float64frombits(4607092731182971626)}, + {t: 1688561898213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688561958213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688562018213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688562078213, v: math.Float64frombits(value.NormalNaN)}, + {t: 1688562138213, v: math.Float64frombits(4607028449581987651)}, + {t: 1688562198213, v: math.Float64frombits(4607028668599367493)}, + {t: 1688562258213, v: math.Float64frombits(value.NormalNaN)}, + } + + var ( + reuseIt chunkenc.Iterator + all []sample + aggrChunks []*AggrChunk + ) + + // downsample from raw to 300s + chks := DownsampleRaw(data, ResLevel1) + testutil.Assert(t, chks != nil, "Downsample from raw to 300s") + + for _, c := range chks { + ac, ok := c.Chunk.(*AggrChunk) + if !ok { + if c.Chunk.NumSamples() == 0 { + continue + } else { + testutil.Ok(t, expandChunkIterator(c.Chunk.Iterator(reuseIt), &all), "expand chunk %d", c.Ref) + aggrDataChunks := DownsampleRaw(all, ResLevel1) + for _, cn := range aggrDataChunks { + ac, ok = cn.Chunk.(*AggrChunk) + testutil.Assert(t, ok, "Not able to convert non-empty XOR chunks to 5m downsampled aggregated chunks.") + } + } + } + aggrChunks = append(aggrChunks, ac) + } + + // validate aggrChunks from first downsample iteration + validateAggrChunks(t, aggrChunks, chks, "First downsample iteration") + + // downsample from 300s to 3600s + downsampledChunks, err := downsampleAggr( + aggrChunks, + &all, + chks[0].MinTime, + chks[len(chks)-1].MaxTime, + ResLevel1, + ResLevel2, + ) + testutil.Ok(t, err, "Downsample from 300s to 3600s") + testutil.Assert(t, downsampledChunks != nil) + + aggrChunks = aggrChunks[:0] + for _, c := range downsampledChunks { + ac, ok := c.Chunk.(*AggrChunk) + if !ok { + if c.Chunk.NumSamples() == 0 { + continue + } else { + t.Fatalf("expected downsampled chunk (*downsample.AggrChunk) got a non-empty %T instead", c.Chunk) + } + } + aggrChunks = append(aggrChunks, ac) + } + + // validate arrgChunks from second downsample iteration + validateAggrChunks(t, aggrChunks, chks, "Second downsample iteration") +} + +func validateAggrChunks(t *testing.T, aggrChunks []*AggrChunk, chks []chunks.Meta, d string) { + for j, c := range aggrChunks { + var iters [2]chunkenc.Iterator + // we need only 0th and 1st AggrType for alignment check, + // but we iterate through all 5 to catch error "invalid size" + for i := 0; i < 5; i++ { + ac, err := c.Get(AggrType(i)) + testutil.Ok(t, err, "%s. Get AggrType(%d) from aggrChunk #%d. MinT %d, MaxT %d", d, i, j, chks[j].MinTime, chks[j].MaxTime) + if i < 2 { + iters[i] = ac.Iterator(nil) + } + } + + // create iterator to check samples + ai := NewAverageChunkIterator(iters[0], iters[1]) + // exhaust iterator and... + for ai.Next() != chunkenc.ValNone { + } + // ...check its error + err := ai.Err() + testutil.Ok(t, err, d) + } } func TestDownsampleAndReadResultingData(t *testing.T) { @@ -1437,7 +2117,7 @@ func TestApplyCounterResetsIterator(t *testing.T) { name: "series with stale marker", chunks: [][]sample{ {{100, 10}, {200, 20}, {300, 10}, {400, 20}, {400, 5}}, - {{500, 10}, {600, 20}, {700, 30}, {800, 40}, {800, 10}}, // No reset, just downsampling addded sample at the end. + {{500, 10}, {600, 20}, {700, 30}, {800, 40}, {800, 10}}, // No reset, just downsampling added sample at the end. {{900, 5}, {1000, 10}, {1100, 15}}, // Actual reset. {{1200, 20}, {1250, math.Float64frombits(value.StaleNaN)}, {1300, 40}}, // No special last sample, no reset. {{1400, 30}, {1500, 30}, {1600, 50}}, // No special last sample, reset. diff --git a/pkg/compact/planner.go b/pkg/compact/planner.go index 783191cacf..394e33185b 100644 --- a/pkg/compact/planner.go +++ b/pkg/compact/planner.go @@ -68,7 +68,7 @@ func (p *tsdbBasedPlanner) plan(noCompactMarked map[ulid.ULID]*metadata.NoCompac } // No overlapping blocks, do compaction the usual way. - // We do not include a recently producted block with max(minTime), so the block which was just uploaded to bucket. + // We do not include a recently produced block with max(minTime), so the block which was just uploaded to bucket. // This gives users a window of a full block size maintenance if needed. if _, excluded := noCompactMarked[metasByMinTime[len(metasByMinTime)-1].ULID]; !excluded { notExcludedMetasByMinTime = notExcludedMetasByMinTime[:len(notExcludedMetasByMinTime)-1] @@ -200,7 +200,7 @@ func splitByRange(metasByMinTime []*metadata.Meta, tr int64) [][]*metadata.Meta t0 = tr * ((m.MinTime - tr + 1) / tr) } - // Skip blocks that don't fall into the range. This can happen via mis-alignment or + // Skip blocks that don't fall into the range. This can happen via misalignment or // by being the multiple of the intended range. if m.MaxTime > t0+tr { i++ @@ -234,6 +234,67 @@ type largeTotalIndexSizeFilter struct { var _ Planner = &largeTotalIndexSizeFilter{} +type verticalCompactionDownsampleFilter struct { + bkt objstore.Bucket + markedForNoCompact prometheus.Counter + + *largeTotalIndexSizeFilter +} + +var _ Planner = &verticalCompactionDownsampleFilter{} + +func WithVerticalCompactionDownsampleFilter(with *largeTotalIndexSizeFilter, bkt objstore.Bucket, markedForNoCompact prometheus.Counter) Planner { + return &verticalCompactionDownsampleFilter{ + markedForNoCompact: markedForNoCompact, + bkt: bkt, + largeTotalIndexSizeFilter: with, + } +} + +func (v *verticalCompactionDownsampleFilter) Plan(ctx context.Context, metasByMinTime []*metadata.Meta, _ chan error, _ any) ([]*metadata.Meta, error) { + noCompactMarked := make(map[ulid.ULID]*metadata.NoCompactMark, 0) +PlanLoop: + for { + plan, err := v.plan(ctx, noCompactMarked, metasByMinTime) + if err != nil { + return nil, err + } + + if len(selectOverlappingMetas(plan)) == 0 { + return plan, nil + } + + // If we have downsampled blocks, we need to mark them as no compact because it's impossible to do that with vertical compaction. + // Technically, the resolution is part of the group key but do not attach ourselves to that level of detail. + var marked = false + for _, m := range plan { + if m.Thanos.Downsample.Resolution == 0 { + continue + } + if err := block.MarkForNoCompact( + ctx, + v.logger, + v.bkt, + m.ULID, + metadata.DownsampleVerticalCompactionNoCompactReason, + "verticalCompactionDownsampleFilter: Downsampled block, see https://github.com/thanos-io/thanos/issues/6775", + v.markedForNoCompact, + ); err != nil { + return nil, errors.Wrapf(err, "mark %v for no compaction", m.ULID.String()) + } + noCompactMarked[m.ULID] = &metadata.NoCompactMark{ID: m.ULID, Version: metadata.NoCompactMarkVersion1} + marked = true + } + + if marked { + continue PlanLoop + } + + return plan, nil + + } +} + // WithLargeTotalIndexSizeFilter wraps Planner with largeTotalIndexSizeFilter that checks the given plans and estimates total index size. // When found, it marks block for no compaction by placing no-compact-mark.json and updating cache. // NOTE: The estimation is very rough as it assumes extreme cases of indexes sharing no bytes, thus summing all source index sizes. @@ -243,16 +304,19 @@ func WithLargeTotalIndexSizeFilter(with *tsdbBasedPlanner, bkt objstore.Bucket, return &largeTotalIndexSizeFilter{tsdbBasedPlanner: with, bkt: bkt, totalMaxIndexSizeBytes: totalMaxIndexSizeBytes, markedForNoCompact: markedForNoCompact} } -func (t *largeTotalIndexSizeFilter) Plan(ctx context.Context, metasByMinTime []*metadata.Meta, _ chan error, _ any) ([]*metadata.Meta, error) { +func (t *largeTotalIndexSizeFilter) plan(ctx context.Context, extraNoCompactMarked map[ulid.ULID]*metadata.NoCompactMark, metasByMinTime []*metadata.Meta) ([]*metadata.Meta, error) { noCompactMarked := t.noCompBlocksFunc() - copiedNoCompactMarked := make(map[ulid.ULID]*metadata.NoCompactMark, len(noCompactMarked)) + copiedNoCompactMarked := make(map[ulid.ULID]*metadata.NoCompactMark, len(noCompactMarked)+len(extraNoCompactMarked)) for k, v := range noCompactMarked { copiedNoCompactMarked[k] = v } + for k, v := range extraNoCompactMarked { + copiedNoCompactMarked[k] = v + } PlanLoop: for { - plan, err := t.plan(copiedNoCompactMarked, metasByMinTime) + plan, err := t.tsdbBasedPlanner.plan(copiedNoCompactMarked, metasByMinTime) if err != nil { return nil, err } @@ -303,3 +367,7 @@ PlanLoop: return plan, nil } } + +func (t *largeTotalIndexSizeFilter) Plan(ctx context.Context, metasByMinTime []*metadata.Meta, _ chan error, _ any) ([]*metadata.Meta, error) { + return t.plan(ctx, nil, metasByMinTime) +} diff --git a/pkg/compact/planner_test.go b/pkg/compact/planner_test.go index 256a8be7bb..9282b51ff0 100644 --- a/pkg/compact/planner_test.go +++ b/pkg/compact/planner_test.go @@ -59,6 +59,8 @@ func (p *tsdbPlannerAdapter) Plan(_ context.Context, metasByMinTime []*metadata. // Adapted from https://github.com/prometheus/prometheus/blob/6c56a1faaaad07317ff585bda75b99bdba0517ad/tsdb/compact_test.go#L167 func TestPlanners_Plan_Compatibility(t *testing.T) { + t.Parallel() + ranges := []int64{ 20, 60, @@ -387,6 +389,8 @@ func TestPlanners_Plan_Compatibility(t *testing.T) { // Adapted form: https://github.com/prometheus/prometheus/blob/6c56a1faaaad07317ff585bda75b99bdba0517ad/tsdb/compact_test.go#L377 func TestRangeWithFailedCompactionWontGetSelected(t *testing.T) { + t.Parallel() + ranges := []int64{ 20, 60, @@ -454,6 +458,8 @@ func TestRangeWithFailedCompactionWontGetSelected(t *testing.T) { } func TestTSDBBasedPlanner_PlanWithNoCompactMarks(t *testing.T) { + t.Parallel() + ranges := []int64{ 20, 60, @@ -646,6 +652,8 @@ func TestTSDBBasedPlanner_PlanWithNoCompactMarks(t *testing.T) { } func TestLargeTotalIndexSizeFilter_Plan(t *testing.T) { + t.Parallel() + ranges := []int64{ 20, 60, diff --git a/pkg/compact/retention_test.go b/pkg/compact/retention_test.go index d80895617c..d883f23fea 100644 --- a/pkg/compact/retention_test.go +++ b/pkg/compact/retention_test.go @@ -28,6 +28,8 @@ import ( ) func TestApplyRetentionPolicyByResolution(t *testing.T) { + t.Parallel() + type testBlock struct { id string minTime time.Time diff --git a/pkg/compactv2/chunk_series_set.go b/pkg/compactv2/chunk_series_set.go index fa3aa18d82..1f70427984 100644 --- a/pkg/compactv2/chunk_series_set.go +++ b/pkg/compactv2/chunk_series_set.go @@ -109,6 +109,7 @@ func (e errChunk) Appender() (chunkenc.Appender, error) { return nil, e. func (e errChunk) Iterator(chunkenc.Iterator) chunkenc.Iterator { return e.err } func (e errChunk) NumSamples() int { return 0 } func (e errChunk) Compact() {} +func (e errChunk) Reset(stream []byte) {} func (l *lazyPopulatableChunk) populate() { // TODO(bwplotka): In most cases we don't need to parse anything, just copy. Extend reader/writer for this. @@ -158,6 +159,13 @@ func (l *lazyPopulatableChunk) NumSamples() int { return l.populated.NumSamples() } +func (l *lazyPopulatableChunk) Reset(stream []byte) { + if l.populated == nil { + l.populate() + } + l.populated.Reset(stream) +} + func (l *lazyPopulatableChunk) Compact() { if l.populated == nil { l.populate() diff --git a/pkg/component/component.go b/pkg/component/component.go index dfbae08289..6c52aef138 100644 --- a/pkg/component/component.go +++ b/pkg/component/component.go @@ -3,12 +3,6 @@ package component -import ( - "strings" - - "github.com/thanos-io/thanos/pkg/store/storepb" -) - // Component is a generic component interface. type Component interface { String() string @@ -18,7 +12,6 @@ type Component interface { type StoreAPI interface { implementsStoreAPI() String() string - ToProto() storepb.StoreType } // Source is a Thanos component that produce blocks of metrics. @@ -33,7 +26,6 @@ type SourceStoreAPI interface { implementsStoreAPI() producesBlocks() String() string - ToProto() storepb.StoreType } type component struct { @@ -48,14 +40,6 @@ type storeAPI struct { func (storeAPI) implementsStoreAPI() {} -func (s sourceStoreAPI) ToProto() storepb.StoreType { - return storepb.StoreType(storepb.StoreType_value[strings.ToUpper(s.String())]) -} - -func (s storeAPI) ToProto() storepb.StoreType { - return storepb.StoreType(storepb.StoreType_value[strings.ToUpper(s.String())]) -} - type source struct { component } @@ -68,26 +52,6 @@ type sourceStoreAPI struct { storeAPI } -// FromProto converts from a gRPC StoreType to StoreAPI. -func FromProto(storeType storepb.StoreType) StoreAPI { - switch storeType { - case storepb.StoreType_QUERY: - return Query - case storepb.StoreType_RULE: - return Rule - case storepb.StoreType_SIDECAR: - return Sidecar - case storepb.StoreType_STORE: - return Store - case storepb.StoreType_RECEIVE: - return Receive - case storepb.StoreType_DEBUG: - return Debug - default: - return UnknownStoreAPI - } -} - func FromString(storeType string) StoreAPI { switch storeType { case "query": @@ -125,4 +89,24 @@ var ( Store = storeAPI{component: component{name: "store"}} UnknownStoreAPI = storeAPI{component: component{name: "unknown-store-api"}} Query = storeAPI{component: component{name: "query"}} + + All = []Component{ + Bucket, + Cleanup, + Mark, + Upload, + Rewrite, + Retention, + Compact, + Downsample, + Replicate, + QueryFrontend, + Debug, + Receive, + Rule, + Sidecar, + Store, + UnknownStoreAPI, + Query, + } ) diff --git a/pkg/dedup/iter_test.go b/pkg/dedup/iter_test.go index 6b437160c9..36a5a36375 100644 --- a/pkg/dedup/iter_test.go +++ b/pkg/dedup/iter_test.go @@ -196,72 +196,72 @@ func toChunkedSeriesSlice(t testing.TB, set storepb.SeriesSet) []chunkedSeries { func TestOverlapSplitSet(t *testing.T) { input := []chunkedSeries{ { - lset: labels.Labels{{Name: "a", Value: "1_empty"}}, + lset: labels.FromStrings("a", "1_empty"), }, { - lset: labels.Labels{{Name: "a", Value: "2_nonoverlap"}}, + lset: labels.FromStrings("a", "2_nonoverlap"), chunks: []storepb.AggrChunk{{MinTime: 0, MaxTime: 20}, {MinTime: 21, MaxTime: 100}, {MinTime: 110, MaxTime: 300}}, }, { - lset: labels.Labels{{Name: "a", Value: "3_tworeplicas"}}, + lset: labels.FromStrings("a", "3_tworeplicas"), chunks: []storepb.AggrChunk{{MinTime: 0, MaxTime: 20}, {MinTime: 0, MaxTime: 30}, {MinTime: 21, MaxTime: 50}, {MinTime: 31, MaxTime: 60}, {MinTime: 100, MaxTime: 160}}, }, { - lset: labels.Labels{{Name: "a", Value: "4_nonoverlap"}}, + lset: labels.FromStrings("a", "4_nonoverlap"), chunks: []storepb.AggrChunk{{MinTime: 50, MaxTime: 55}, {MinTime: 56, MaxTime: 100}}, }, { - lset: labels.Labels{{Name: "a", Value: "5_minimaloverlap"}}, + lset: labels.FromStrings("a", "5_minimaloverlap"), chunks: []storepb.AggrChunk{{MinTime: 50, MaxTime: 55}, {MinTime: 55, MaxTime: 100}}, }, { - lset: labels.Labels{{Name: "a", Value: "6_fourreplica"}}, + lset: labels.FromStrings("a", "6_fourreplica"), chunks: []storepb.AggrChunk{{MinTime: 0, MaxTime: 20}, {MinTime: 0, MaxTime: 30}, {MinTime: 1, MaxTime: 15}, {MinTime: 2, MaxTime: 36}, {MinTime: 16, MaxTime: 200}, {MinTime: 21, MaxTime: 50}, {MinTime: 31, MaxTime: 60}, {MinTime: 100, MaxTime: 160}}, }, } exp := []chunkedSeries{ { - lset: labels.Labels{{Name: "a", Value: "1_empty"}}, + lset: labels.FromStrings("a", "1_empty"), }, { - lset: labels.Labels{{Name: "a", Value: "2_nonoverlap"}}, + lset: labels.FromStrings("a", "2_nonoverlap"), chunks: []storepb.AggrChunk{{MinTime: 0, MaxTime: 20}, {MinTime: 21, MaxTime: 100}, {MinTime: 110, MaxTime: 300}}, }, { - lset: labels.Labels{{Name: "a", Value: "3_tworeplicas"}}, + lset: labels.FromStrings("a", "3_tworeplicas"), chunks: []storepb.AggrChunk{{MinTime: 0, MaxTime: 20}, {MinTime: 21, MaxTime: 50}, {MinTime: 100, MaxTime: 160}}, }, { - lset: labels.Labels{{Name: "a", Value: "3_tworeplicas"}}, + lset: labels.FromStrings("a", "3_tworeplicas"), chunks: []storepb.AggrChunk{{MinTime: 0, MaxTime: 30}, {MinTime: 31, MaxTime: 60}}, }, { - lset: labels.Labels{{Name: "a", Value: "4_nonoverlap"}}, + lset: labels.FromStrings("a", "4_nonoverlap"), chunks: []storepb.AggrChunk{{MinTime: 50, MaxTime: 55}, {MinTime: 56, MaxTime: 100}}, }, { - lset: labels.Labels{{Name: "a", Value: "5_minimaloverlap"}}, + lset: labels.FromStrings("a", "5_minimaloverlap"), chunks: []storepb.AggrChunk{{MinTime: 50, MaxTime: 55}}, }, { - lset: labels.Labels{{Name: "a", Value: "5_minimaloverlap"}}, + lset: labels.FromStrings("a", "5_minimaloverlap"), chunks: []storepb.AggrChunk{{MinTime: 55, MaxTime: 100}}, }, { - lset: labels.Labels{{Name: "a", Value: "6_fourreplica"}}, + lset: labels.FromStrings("a", "6_fourreplica"), chunks: []storepb.AggrChunk{{MinTime: 0, MaxTime: 20}, {MinTime: 21, MaxTime: 50}, {MinTime: 100, MaxTime: 160}}, }, { - lset: labels.Labels{{Name: "a", Value: "6_fourreplica"}}, + lset: labels.FromStrings("a", "6_fourreplica"), chunks: []storepb.AggrChunk{{MinTime: 0, MaxTime: 30}, {MinTime: 31, MaxTime: 60}}, }, { - lset: labels.Labels{{Name: "a", Value: "6_fourreplica"}}, + lset: labels.FromStrings("a", "6_fourreplica"), chunks: []storepb.AggrChunk{{MinTime: 1, MaxTime: 15}, {MinTime: 16, MaxTime: 200}}, }, { - lset: labels.Labels{{Name: "a", Value: "6_fourreplica"}}, + lset: labels.FromStrings("a", "6_fourreplica"), chunks: []storepb.AggrChunk{{MinTime: 2, MaxTime: 36}}, }, } @@ -281,46 +281,46 @@ func TestDedupSeriesSet(t *testing.T) { name: "Single dedup label", input: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{60000, 3}, {70000, 4}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{200000, 5}, {210000, 6}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}, {Name: "d", Value: "4"}}, + lset: labels.FromStrings("a", "1", "c", "3", "d", "4"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "4"}}, + lset: labels.FromStrings("a", "1", "c", "4"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "2"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "2", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "2"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "2", "c", "3"), samples: []sample{{60000, 3}, {70000, 4}}, }, }, exp: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}, {60000, 3}, {70000, 4}, {200000, 5}, {210000, 6}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}, {Name: "d", Value: "4"}}, + lset: labels.FromStrings("a", "1", "c", "3", "d", "4"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "4"}}, + lset: labels.FromStrings("a", "1", "c", "4"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "2"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "2", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}, {60000, 3}, {70000, 4}}, }, }, @@ -329,50 +329,50 @@ func TestDedupSeriesSet(t *testing.T) { name: "Multi dedup label", input: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{60000, 3}, {70000, 4}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{200000, 5}, {210000, 6}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}, {Name: "d", Value: "4"}}, + lset: labels.FromStrings("a", "1", "c", "3", "d", "4"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "4"}}, + lset: labels.FromStrings("a", "1", "c", "4"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "2"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "2", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "2"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "2", "c", "3"), samples: []sample{{60000, 3}, {70000, 4}}, }, }, exp: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}, {60000, 3}, {70000, 4}, {200000, 5}, {210000, 6}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}, {Name: "d", Value: "4"}}, + lset: labels.FromStrings("a", "1", "c", "3", "d", "4"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "4"}}, + lset: labels.FromStrings("a", "1", "c", "4"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "2"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "2", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}, {60000, 3}, {70000, 4}}, }, }, @@ -381,16 +381,16 @@ func TestDedupSeriesSet(t *testing.T) { name: "Multi dedup label - some series don't have all dedup labels", input: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}}, }, { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{60000, 3}, {70000, 4}}, }, }, exp: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}, {Name: "c", Value: "3"}}, + lset: labels.FromStrings("a", "1", "c", "3"), samples: []sample{{10000, 1}, {20000, 2}, {60000, 3}, {70000, 4}}, }, }, @@ -406,7 +406,7 @@ func TestDedupSeriesSet(t *testing.T) { isCounter: true, input: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: []sample{ {10000, 8.0}, // Smaller timestamp, this will be chosen. CurrValue = 8.0. {20000, 9.0}, // Same. CurrValue = 9.0. @@ -419,7 +419,7 @@ func TestDedupSeriesSet(t *testing.T) { {100000, 9 + 6.0}, }, }, { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: []sample{ {10001, 8.0}, // Penalty 5000 will be added. // 20001 was app reset. No sample, because stale marker but removed by downsample.CounterSeriesIterator. Penalty 2 * (20000 - 10000) will be added. @@ -433,7 +433,7 @@ func TestDedupSeriesSet(t *testing.T) { }, exp: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: []sample{{10000, 8}, {20000, 9}, {45001, 9}, {55001, 10}, {65001, 11}, {90000, 14}, {100000, 15}}, }, }, @@ -444,12 +444,12 @@ func TestDedupSeriesSet(t *testing.T) { isCounter: false, input: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: []sample{ {10000, 8.0}, {20000, 9.0}, {50001, 9 + 1.0}, {60000, 9 + 2.0}, {70000, 9 + 3.0}, {80000, 9 + 4.0}, {90000, 9 + 5.0}, {100000, 9 + 6.0}, }, }, { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: []sample{ {10001, 8.0}, {45001, 8 + 0.5}, {55001, 8 + 1.5}, {65001, 8 + 2.5}, }, @@ -457,7 +457,7 @@ func TestDedupSeriesSet(t *testing.T) { }, exp: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: []sample{{10000, 8}, {20000, 9}, {45001, 8.5}, {55001, 9.5}, {65001, 10.5}, {90000, 14}, {100000, 15}}, }, }, @@ -469,7 +469,7 @@ func TestDedupSeriesSet(t *testing.T) { isCounter: true, input: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: []sample{ {t: 1587690005791, f: 461968}, {t: 1587690020791, f: 462151}, {t: 1587690035797, f: 462336}, {t: 1587690050791, f: 462650}, {t: 1587690065791, f: 462813}, {t: 1587690080791, f: 462987}, {t: 1587690095791, f: 463095}, {t: 1587690110791, f: 463247}, {t: 1587690125791, f: 463440}, {t: 1587690140791, f: 463642}, {t: 1587690155791, f: 463811}, {t: 1587690170791, f: 464027}, {t: 1587690185791, f: 464308}, {t: 1587690200791, f: 464514}, {t: 1587690215791, f: 464798}, {t: 1587690230791, f: 465018}, {t: 1587690245791, f: 465215}, {t: 1587690260813, f: 465431}, {t: 1587690275791, f: 465651}, {t: 1587690290791, f: 465870}, {t: 1587690305791, f: 466070}, {t: 1587690320792, f: 466248}, @@ -495,7 +495,7 @@ func TestDedupSeriesSet(t *testing.T) { {t: 1587693530816, f: 510666}, {t: 1587693545791, f: 510871}, {t: 1587693560791, f: 511123}, {t: 1587693575791, f: 511303}, {t: 1587693590791, f: 511500}, }, }, { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: []sample{ {t: 1587690007139, f: 461993}, {t: 1587690022139, f: 462164}, {t: 1587690037139, f: 462409}, {t: 1587690052139, f: 462662}, {t: 1587690067139, f: 462824}, {t: 1587690082139, f: 462987}, {t: 1587690097155, f: 463108}, {t: 1587690112139, f: 463261}, {t: 1587690127139, f: 463465}, {t: 1587690142139, f: 463642}, {t: 1587690157139, f: 463823}, {t: 1587690172139, f: 464065}, {t: 1587690187139, f: 464333}, {t: 1587690202139, f: 464566}, {t: 1587690217139, f: 464811}, {t: 1587690232140, f: 465032}, {t: 1587690247139, f: 465229}, {t: 1587690262139, f: 465445}, {t: 1587690277139, f: 465700}, {t: 1587690292139, f: 465884}, @@ -526,7 +526,7 @@ func TestDedupSeriesSet(t *testing.T) { }, exp: []series{ { - lset: labels.Labels{{Name: "a", Value: "1"}}, + lset: labels.FromStrings("a", "1"), samples: expectedRealSeriesWithStaleMarkerDeduplicatedForRate, }, }, diff --git a/pkg/discovery/dns/grpc.go b/pkg/discovery/dns/grpc.go new file mode 100644 index 0000000000..79e832b652 --- /dev/null +++ b/pkg/discovery/dns/grpc.go @@ -0,0 +1,111 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package dns + +import ( + "context" + "sync" + "time" + + "github.com/go-kit/log" + grpcresolver "google.golang.org/grpc/resolver" +) + +var ( + _ grpcresolver.Builder = &builder{} + _ grpcresolver.Resolver = &resolver{} +) + +type builder struct { + resolveInterval time.Duration + provider *Provider + logger log.Logger +} + +func RegisterGRPCResolver(provider *Provider, interval time.Duration, logger log.Logger) { + grpcresolver.Register(&builder{ + resolveInterval: interval, + provider: provider, + logger: logger, + }) +} + +func (b *builder) Scheme() string { return "thanos" } + +func (b *builder) Build(t grpcresolver.Target, cc grpcresolver.ClientConn, _ grpcresolver.BuildOptions) (grpcresolver.Resolver, error) { + ctx, cancel := context.WithCancel(context.Background()) + r := &resolver{ + provider: b.provider, + target: t.Endpoint(), + ctx: ctx, + cancel: cancel, + cc: cc, + interval: b.resolveInterval, + logger: b.logger, + } + r.wg.Add(1) + go r.run() + + return r, nil +} + +type resolver struct { + provider *Provider + + target string + ctx context.Context + cancel context.CancelFunc + cc grpcresolver.ClientConn + interval time.Duration + + wg sync.WaitGroup + logger log.Logger +} + +func (r *resolver) Close() { + r.cancel() + r.wg.Wait() +} + +func (r *resolver) ResolveNow(_ grpcresolver.ResolveNowOptions) {} + +func (r *resolver) resolve() error { + ctx, cancel := context.WithTimeout(r.ctx, r.interval) + defer cancel() + return r.provider.Resolve(ctx, []string{r.target}, false) +} + +func (r *resolver) addresses() []string { + return r.provider.AddressesForHost(r.target) +} + +func (r *resolver) run() { + defer r.wg.Done() + for { + func() { + if err := r.resolve(); err != nil { + r.cc.ReportError(err) + r.logger.Log("msg", "failed to resolve", "err", err) + return + } + state := grpcresolver.State{} + addrs := r.addresses() + if len(addrs) == 0 { + r.logger.Log("msg", "no addresses resolved", "target", r.target) + return + } + for _, addr := range addrs { + state.Addresses = append(state.Addresses, grpcresolver.Address{Addr: addr}) + } + if err := r.cc.UpdateState(state); err != nil { + r.logger.Log("msg", "failed to update state", "err", err) + } + }() + select { + case <-r.ctx.Done(): + return + case <-time.After(r.interval): + } + } +} diff --git a/pkg/discovery/dns/provider.go b/pkg/discovery/dns/provider.go index 3ec032a654..f9c1c7f583 100644 --- a/pkg/discovery/dns/provider.go +++ b/pkg/discovery/dns/provider.go @@ -110,7 +110,7 @@ func GetQTypeName(addr string) (qtype, name string) { // Resolve stores a list of provided addresses or their DNS records if requested. // Addresses prefixed with `dns+` or `dnssrv+` will be resolved through respective DNS lookup (A/AAAA or SRV). // For non-SRV records, it will return an error if a port is not supplied. -func (p *Provider) Resolve(ctx context.Context, addrs []string) error { +func (p *Provider) Resolve(ctx context.Context, addrs []string, flushOld bool) error { resolvedAddrs := map[string][]string{} errs := errutil.MultiError{} @@ -129,10 +129,7 @@ func (p *Provider) Resolve(ctx context.Context, addrs []string) error { errs.Add(err) // The DNS resolution failed. Continue without modifying the old records. p.resolverFailuresCount.Inc() - // Use cached values. - p.RLock() - resolved = p.resolved[addr] - p.RUnlock() + continue } resolvedAddrs[addr] = resolved } @@ -143,13 +140,17 @@ func (p *Provider) Resolve(ctx context.Context, addrs []string) error { defer p.Unlock() p.resolverAddrs.ResetTx() + if flushOld && len(errs) == 0 { + p.resolved = map[string][]string{} + } for name, addrs := range resolvedAddrs { + p.resolved[name] = addrs + } + for name, addrs := range p.resolved { p.resolverAddrs.WithLabelValues(name).Set(float64(len(addrs))) } p.resolverAddrs.Submit() - p.resolved = resolvedAddrs - return errs.Err() } @@ -164,3 +165,16 @@ func (p *Provider) Addresses() []string { } return result } + +// AddressesForHost returns the latest addresses present for the host in the Provider. +func (p *Provider) AddressesForHost(host string) []string { + p.RLock() + defer p.RUnlock() + + addrs := p.resolved[host] + + res := make([]string, len(addrs)) + copy(res, addrs) + + return res +} diff --git a/pkg/discovery/dns/provider_test.go b/pkg/discovery/dns/provider_test.go index 439138ef4d..b0d48fd765 100644 --- a/pkg/discovery/dns/provider_test.go +++ b/pkg/discovery/dns/provider_test.go @@ -33,7 +33,7 @@ func TestProvider(t *testing.T) { } ctx := context.TODO() - err := prv.Resolve(ctx, []string{"any+x"}) + err := prv.Resolve(ctx, []string{"any+x"}, false) testutil.Ok(t, err) result := prv.Addresses() sort.Strings(result) @@ -41,58 +41,67 @@ func TestProvider(t *testing.T) { testutil.Equals(t, 1, promtestutil.CollectAndCount(prv.resolverAddrs)) testutil.Equals(t, float64(0), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+x"))) - err = prv.Resolve(ctx, []string{"any+a", "any+b", "any+c"}) + err = prv.Resolve(ctx, []string{"any+a", "any+b", "any+c"}, false) testutil.Ok(t, err) result = prv.Addresses() sort.Strings(result) testutil.Equals(t, ips, result) - testutil.Equals(t, 3, promtestutil.CollectAndCount(prv.resolverAddrs)) + testutil.Equals(t, 4, promtestutil.CollectAndCount(prv.resolverAddrs)) testutil.Equals(t, float64(2), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+a"))) testutil.Equals(t, float64(2), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+b"))) testutil.Equals(t, float64(1), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+c"))) - err = prv.Resolve(ctx, []string{"any+b", "any+c"}) + err = prv.Resolve(ctx, []string{"any+b", "any+c"}, false) testutil.Ok(t, err) result = prv.Addresses() sort.Strings(result) - testutil.Equals(t, ips[2:], result) - testutil.Equals(t, 2, promtestutil.CollectAndCount(prv.resolverAddrs)) + testutil.Equals(t, ips, result) + testutil.Equals(t, 4, promtestutil.CollectAndCount(prv.resolverAddrs)) testutil.Equals(t, float64(2), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+b"))) testutil.Equals(t, float64(1), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+c"))) - err = prv.Resolve(ctx, []string{"any+x"}) + err = prv.Resolve(ctx, []string{"any+x"}, false) testutil.Ok(t, err) result = prv.Addresses() sort.Strings(result) - testutil.Equals(t, []string(nil), result) - testutil.Equals(t, 1, promtestutil.CollectAndCount(prv.resolverAddrs)) + testutil.Equals(t, ips, result) + testutil.Equals(t, 4, promtestutil.CollectAndCount(prv.resolverAddrs)) testutil.Equals(t, float64(0), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+x"))) - err = prv.Resolve(ctx, []string{"any+a", "any+b", "any+c"}) + err = prv.Resolve(ctx, []string{"any+a", "any+b", "any+c"}, false) testutil.Ok(t, err) result = prv.Addresses() sort.Strings(result) testutil.Equals(t, ips, result) - testutil.Equals(t, 3, promtestutil.CollectAndCount(prv.resolverAddrs)) + testutil.Equals(t, 4, promtestutil.CollectAndCount(prv.resolverAddrs)) testutil.Equals(t, float64(2), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+a"))) testutil.Equals(t, float64(2), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+b"))) testutil.Equals(t, float64(1), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+c"))) - err = prv.Resolve(ctx, []string{"any+b", "example.com:90", "any+c"}) + err = prv.Resolve(ctx, []string{"any+b", "example.com:90", "any+c"}, false) testutil.Ok(t, err) result = prv.Addresses() sort.Strings(result) - testutil.Equals(t, append(ips[2:], "example.com:90"), result) - testutil.Equals(t, 3, promtestutil.CollectAndCount(prv.resolverAddrs)) + testutil.Equals(t, append(ips, "example.com:90"), result) + testutil.Equals(t, 5, promtestutil.CollectAndCount(prv.resolverAddrs)) testutil.Equals(t, float64(2), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+b"))) testutil.Equals(t, float64(1), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("example.com:90"))) testutil.Equals(t, float64(1), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+c"))) - err = prv.Resolve(ctx, []string{"any+b", "any+c"}) + err = prv.Resolve(ctx, []string{"any+b", "any+c"}, false) + testutil.Ok(t, err) + result = prv.Addresses() + sort.Strings(result) + testutil.Equals(t, append(ips, "example.com:90"), result) + testutil.Equals(t, 5, promtestutil.CollectAndCount(prv.resolverAddrs)) + testutil.Equals(t, float64(2), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+b"))) + testutil.Equals(t, float64(1), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+c"))) + + err = prv.Resolve(ctx, []string{"any+b", "any+c"}, true) testutil.Ok(t, err) result = prv.Addresses() sort.Strings(result) - testutil.Equals(t, ips[2:], result) + testutil.Equals(t, ips[2:5], result) testutil.Equals(t, 2, promtestutil.CollectAndCount(prv.resolverAddrs)) testutil.Equals(t, float64(2), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+b"))) testutil.Equals(t, float64(1), promtestutil.ToFloat64(prv.resolverAddrs.WithLabelValues("any+c"))) diff --git a/pkg/discovery/dns/resolver.go b/pkg/discovery/dns/resolver.go index d0078aea57..0025178607 100644 --- a/pkg/discovery/dns/resolver.go +++ b/pkg/discovery/dns/resolver.go @@ -108,7 +108,9 @@ func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string } if qtype == SRVNoA { - res = append(res, appendScheme(scheme, net.JoinHostPort(rec.Target, resPort))) + // Remove the final dot from rooted DNS names (this is for compatibility with Prometheus) + target := strings.TrimRight(rec.Target, ".") + res = append(res, appendScheme(scheme, net.JoinHostPort(target, resPort))) continue } // Do A lookup for the domain in SRV answer. diff --git a/pkg/discovery/memcache/provider.go b/pkg/discovery/memcache/provider.go index 0456a52bf4..1560c55951 100644 --- a/pkg/discovery/memcache/provider.go +++ b/pkg/discovery/memcache/provider.go @@ -58,7 +58,7 @@ func NewProvider(logger log.Logger, reg prometheus.Registerer, dialTimeout time. } // Resolve stores a list of nodes auto-discovered from the provided addresses. -func (p *Provider) Resolve(ctx context.Context, addresses []string) error { +func (p *Provider) Resolve(ctx context.Context, addresses []string, flushOld bool) error { clusterConfigs := map[string]*clusterConfig{} errs := errutil.MultiError{} @@ -74,13 +74,9 @@ func (p *Provider) Resolve(ctx context.Context, addresses []string) error { errs.Add(err) p.resolverFailuresCount.Inc() - // Use cached values. - p.RLock() - clusterConfigs[address] = p.clusterConfigs[address] - p.RUnlock() - } else { - clusterConfigs[address] = clusterConfig + continue } + clusterConfigs[address] = clusterConfig } p.Lock() @@ -95,7 +91,12 @@ func (p *Provider) Resolve(ctx context.Context, addresses []string) error { p.resolvedAddresses.Submit() p.configVersion.Submit() - p.clusterConfigs = clusterConfigs + if flushOld && len(errs) == 0 { + p.clusterConfigs = map[string]*clusterConfig{} + } + for addr, config := range clusterConfigs { + p.clusterConfigs[addr] = config + } return errs.Err() } diff --git a/pkg/discovery/memcache/provider_test.go b/pkg/discovery/memcache/provider_test.go index a25d392334..02a2940770 100644 --- a/pkg/discovery/memcache/provider_test.go +++ b/pkg/discovery/memcache/provider_test.go @@ -28,7 +28,7 @@ func TestProviderUpdatesAddresses(t *testing.T) { } provider.resolver = &resolver - testutil.Ok(t, provider.Resolve(ctx, clusters)) + testutil.Ok(t, provider.Resolve(ctx, clusters, true)) addresses := provider.Addresses() sort.Strings(addresses) testutil.Equals(t, []string{"dns-1:11211", "dns-2:8080"}, addresses) @@ -38,7 +38,7 @@ func TestProviderUpdatesAddresses(t *testing.T) { "memcached-cluster-2": {nodes: []node{{dns: "dns-2", ip: "ip-2", port: 8080}}}, } - testutil.Ok(t, provider.Resolve(ctx, clusters)) + testutil.Ok(t, provider.Resolve(ctx, clusters, true)) addresses = provider.Addresses() sort.Strings(addresses) testutil.Equals(t, []string{"dns-1:11211", "dns-2:8080", "dns-3:11211"}, addresses) @@ -56,7 +56,7 @@ func TestProviderDoesNotUpdateAddressIfFailed(t *testing.T) { } provider.resolver = &resolver - testutil.Ok(t, provider.Resolve(ctx, clusters)) + testutil.Ok(t, provider.Resolve(ctx, clusters, true)) addresses := provider.Addresses() sort.Strings(addresses) testutil.Equals(t, []string{"dns-1:11211", "dns-2:8080"}, addresses) @@ -64,7 +64,7 @@ func TestProviderDoesNotUpdateAddressIfFailed(t *testing.T) { resolver.configs = nil resolver.err = errors.New("oops") - testutil.NotOk(t, provider.Resolve(ctx, clusters)) + testutil.NotOk(t, provider.Resolve(ctx, clusters, true)) addresses = provider.Addresses() sort.Strings(addresses) testutil.Equals(t, []string{"dns-1:11211", "dns-2:8080"}, addresses) diff --git a/pkg/errors/errors.go b/pkg/errors/errors.go index a74cbcea20..2a56473a12 100644 --- a/pkg/errors/errors.go +++ b/pkg/errors/errors.go @@ -44,11 +44,11 @@ func (b *base) Unwrap() error { // Whenever error is printed with %+v format verb, stacktrace info gets dumped to the output. func (b *base) Format(s fmt.State, verb rune) { if verb == 'v' && s.Flag('+') { - s.Write([]byte(formatErrorChain(b))) + _, _ = s.Write([]byte(formatErrorChain(b))) return } - s.Write([]byte(b.Error())) + _, _ = s.Write([]byte(b.Error())) } // Newf formats according to a format specifier and returns a new error with a stacktrace @@ -118,7 +118,7 @@ func formatErrorChain(err error) string { // The functions `Is`, `As` & `Unwrap` provides a thin wrapper around the builtin errors // package in go. Just for sake of completeness and correct autocompletion behaviors from // IDEs they have been wrapped using functions instead of using variable to reference them -// as first class functions (eg: var Is = errros.Is ). +// as first class functions (eg: var Is = errors.Is ). // Is is a wrapper of built-in errors.Is. It reports whether any error in err's // chain matches target. The chain consists of err itself followed by the sequence diff --git a/pkg/exemplars/multitsdb.go b/pkg/exemplars/multitsdb.go index c70811b8db..985f0b6bfe 100644 --- a/pkg/exemplars/multitsdb.go +++ b/pkg/exemplars/multitsdb.go @@ -6,6 +6,7 @@ package exemplars import ( "github.com/pkg/errors" "github.com/prometheus/prometheus/promql/parser" + "github.com/thanos-io/thanos/pkg/extpromql" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -26,7 +27,7 @@ func NewMultiTSDB(tsdbExemplarsServers func() map[string]*TSDB) *MultiTSDB { // Exemplars returns all specified exemplars from a MultiTSDB instance. func (m *MultiTSDB) Exemplars(r *exemplarspb.ExemplarsRequest, s exemplarspb.Exemplars_ExemplarsServer) error { - expr, err := parser.ParseExpr(r.Query) + expr, err := extpromql.ParseExpr(r.Query) if err != nil { return status.Error(codes.Internal, err.Error()) } diff --git a/pkg/exemplars/proxy.go b/pkg/exemplars/proxy.go index e32b8645c1..c7d8fb911c 100644 --- a/pkg/exemplars/proxy.go +++ b/pkg/exemplars/proxy.go @@ -19,6 +19,8 @@ import ( "google.golang.org/grpc/status" "github.com/thanos-io/thanos/pkg/exemplars/exemplarspb" + "github.com/thanos-io/thanos/pkg/extpromql" + "github.com/thanos-io/thanos/pkg/store" "github.com/thanos-io/thanos/pkg/store/storepb" "github.com/thanos-io/thanos/pkg/tracing" ) @@ -58,7 +60,7 @@ func (s *Proxy) Exemplars(req *exemplarspb.ExemplarsRequest, srv exemplarspb.Exe span, ctx := tracing.StartSpan(srv.Context(), "proxy_exemplars") defer span.Finish() - expr, err := parser.ParseExpr(req.Query) + expr, err := extpromql.ParseExpr(req.Query) if err != nil { return err } @@ -85,28 +87,21 @@ func (s *Proxy) Exemplars(req *exemplarspb.ExemplarsRequest, srv exemplarspb.Exe for _, st := range s.exemplars() { queryParts = queryParts[:0] - Matchers: - for _, matchers := range selectors { - matcherSet := make(map[string]struct{}) - for _, m := range matchers { - for _, ls := range st.LabelSets { - if lv := ls.Get(m.Name); lv != "" { - if !m.Matches(lv) { - continue Matchers - } else { - // If the current matcher matches one external label, - // we don't add it to the current metric selector - // as Prometheus' Exemplars API cannot handle external labels. - continue - } - } - matcherSet[m.String()] = struct{}{} - } + for _, matcherSet := range selectors { + extLbls := st.LabelSets + if !store.LabelSetsMatch(matcherSet, extLbls...) { + continue } labelMatchers = labelMatchers[:0] - for m := range matcherSet { - labelMatchers = append(labelMatchers, m) + for _, m := range matcherSet { + if containsLabelName(m.Name, extLbls) { + // If the current matcher matches one external label, + // we don't add it to the current metric selector + // as Prometheus' Exemplars API cannot handle external labels. + continue + } + labelMatchers = append(labelMatchers, m.String()) } queryParts = append(queryParts, "{"+strings.Join(labelMatchers, ", ")+"}") @@ -164,6 +159,15 @@ func (s *Proxy) Exemplars(req *exemplarspb.ExemplarsRequest, srv exemplarspb.Exe return nil } +func containsLabelName(name string, sets []labels.Labels) bool { + for _, ls := range sets { + if ls.Get(name) != "" { + return true + } + } + return false +} + func (stream *exemplarsStream) receive(ctx context.Context) error { exemplars, err := stream.client.Exemplars(ctx, stream.request) if err != nil { diff --git a/pkg/exemplars/proxy_test.go b/pkg/exemplars/proxy_test.go index 7de5f6e2fa..0e0ca58f8e 100644 --- a/pkg/exemplars/proxy_test.go +++ b/pkg/exemplars/proxy_test.go @@ -12,6 +12,7 @@ import ( "sync" "testing" + "github.com/efficientgo/core/testutil" "github.com/go-kit/log" "github.com/pkg/errors" "github.com/prometheus/prometheus/model/labels" @@ -21,8 +22,8 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "github.com/efficientgo/core/testutil" "github.com/thanos-io/thanos/pkg/exemplars/exemplarspb" + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb" ) @@ -53,7 +54,7 @@ func (t *testExemplarClient) Recv() (*exemplarspb.ExemplarsResponse, error) { } func (t *testExemplarClient) Exemplars(ctx context.Context, in *exemplarspb.ExemplarsRequest, opts ...grpc.CallOption) (exemplarspb.Exemplars_ExemplarsClient, error) { - expr, err := parser.ParseExpr(in.Query) + expr, err := extpromql.ParseExpr(in.Query) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -243,6 +244,31 @@ func TestProxy(t *testing.T) { }), }, }, + { + name: "one external label matches one of the selector labels", + request: &exemplarspb.ExemplarsRequest{ + Query: `http_request_duration_bucket{cluster="A"}`, + PartialResponseStrategy: storepb.PartialResponseStrategy_WARN, + }, + clients: []*exemplarspb.ExemplarStore{ + { + ExemplarsClient: &testExemplarClient{ + response: exemplarspb.NewExemplarsResponse(&exemplarspb.ExemplarData{ + SeriesLabels: labelpb.ZLabelSet{Labels: labelpb.ZLabelsFromPromLabels(labels.FromMap(map[string]string{"__name__": "http_request_duration_bucket"}))}, + Exemplars: []*exemplarspb.Exemplar{{Value: 1}}, + }), + }, + LabelSets: []labels.Labels{labels.FromMap(map[string]string{"cluster": "non-matching"}), labels.FromMap(map[string]string{"cluster": "A"})}, + }, + }, + server: &testExemplarServer{}, + wantResponses: []*exemplarspb.ExemplarsResponse{ + exemplarspb.NewExemplarsResponse(&exemplarspb.ExemplarData{ + SeriesLabels: labelpb.ZLabelSet{Labels: labelpb.ZLabelsFromPromLabels(labels.FromMap(map[string]string{"__name__": "http_request_duration_bucket"}))}, + Exemplars: []*exemplarspb.Exemplar{{Value: 1}}, + }), + }, + }, { name: "external label selects stores", request: &exemplarspb.ExemplarsRequest{ @@ -341,12 +367,13 @@ func TestProxy(t *testing.T) { // for matched response for simplicity. Outer: for _, exp := range tc.wantResponses { + var lres *exemplarspb.ExemplarsResponse for _, res := range tc.server.responses { if reflect.DeepEqual(exp, res) { continue Outer } } - t.Errorf("miss expected response %v", exp) + t.Errorf("miss expected response %v. got: %v", exp, lres) } }) } diff --git a/pkg/extgrpc/client.go b/pkg/extgrpc/client.go index 15ccd03eb6..a6dcc7b633 100644 --- a/pkg/extgrpc/client.go +++ b/pkg/extgrpc/client.go @@ -9,8 +9,7 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware/v2" - grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + grpc_prometheus "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus" "github.com/opentracing/opentracing-go" "github.com/prometheus/client_golang/prometheus" "google.golang.org/grpc" @@ -18,6 +17,7 @@ import ( "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" + grpcserver "github.com/thanos-io/thanos/pkg/server/grpc" "github.com/thanos-io/thanos/pkg/tls" "github.com/thanos-io/thanos/pkg/tracing" ) @@ -46,9 +46,14 @@ func EndpointGroupGRPCOpts() []grpc.DialOption { // StoreClientGRPCOpts creates gRPC dial options for connecting to a store client. func StoreClientGRPCOpts(logger log.Logger, reg prometheus.Registerer, tracer opentracing.Tracer, secure, skipVerify bool, cert, key, caCert, serverName string) ([]grpc.DialOption, error) { - grpcMets := grpc_prometheus.NewClientMetrics() - grpcMets.EnableClientHandlingTimeHistogram( - grpc_prometheus.WithHistogramBuckets([]float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120, 240, 360, 720}), + grpcMets := grpc_prometheus.NewClientMetrics( + grpc_prometheus.WithClientHandlingTimeHistogram(grpc_prometheus.WithHistogramOpts( + &prometheus.HistogramOpts{ + Buckets: []float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120, 240, 360, 720}, + NativeHistogramMaxBucketNumber: 256, + NativeHistogramBucketFactor: 1.1, + }, + )), ) dialOpts := []grpc.DialOption{ // We want to make sure that we can receive huge gRPC messages from storeAPI. @@ -56,18 +61,17 @@ func StoreClientGRPCOpts(logger log.Logger, reg prometheus.Registerer, tracer op // Current limit is ~2GB. // TODO(bplotka): Split sent chunks on store node per max 4MB chunks if needed. grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt32)), - grpc.WithUnaryInterceptor( - grpc_middleware.ChainUnaryClient( - grpcMets.UnaryClientInterceptor(), - tracing.UnaryClientInterceptor(tracer), - ), + grpc.WithChainUnaryInterceptor( + grpcserver.NewUnaryClientRequestIDInterceptor(), + grpcMets.UnaryClientInterceptor(), + tracing.UnaryClientInterceptor(tracer), ), - grpc.WithStreamInterceptor( - grpc_middleware.ChainStreamClient( - grpcMets.StreamClientInterceptor(), - tracing.StreamClientInterceptor(tracer), - ), + grpc.WithChainStreamInterceptor( + grpcserver.NewStreamClientRequestIDInterceptor(), + grpcMets.StreamClientInterceptor(), + tracing.StreamClientInterceptor(tracer), ), + grpc.WithKeepaliveParams(keepalive.ClientParameters{Time: 10 * time.Second, Timeout: 5 * time.Second}), } if reg != nil { reg.MustRegister(grpcMets) diff --git a/pkg/exthttp/hedging.go b/pkg/exthttp/hedging.go new file mode 100644 index 0000000000..af200bd92e --- /dev/null +++ b/pkg/exthttp/hedging.go @@ -0,0 +1,96 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package exthttp + +import ( + "fmt" + "net/http" + "sync" + "time" + + "github.com/caio/go-tdigest" + "github.com/cristalhq/hedgedhttp" +) + +type CustomBucketConfig struct { + HedgingConfig HedgingConfig `yaml:"hedging_config"` +} + +type HedgingConfig struct { + Enabled bool `yaml:"enabled"` + UpTo uint `yaml:"up_to"` + Quantile float64 `yaml:"quantile"` +} + +func DefaultCustomBucketConfig() CustomBucketConfig { + return CustomBucketConfig{ + HedgingConfig: HedgingConfig{ + Enabled: false, + UpTo: 3, + Quantile: 0.9, + }, + } +} + +type hedgingRoundTripper struct { + Transport http.RoundTripper + TDigest *tdigest.TDigest + mu sync.RWMutex + config HedgingConfig +} + +func (hrt *hedgingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + start := time.Now() + resp, err := hrt.Transport.RoundTrip(req) + if err != nil { + return nil, err + } + duration := float64(time.Since(start).Milliseconds()) + hrt.mu.Lock() + defer hrt.mu.Unlock() + err = hrt.TDigest.Add(duration) + if err != nil { + return nil, err + } + return resp, err +} + +func (hrt *hedgingRoundTripper) nextFn() (int, time.Duration) { + hrt.mu.RLock() + defer hrt.mu.RUnlock() + + delayMs := hrt.TDigest.Quantile(hrt.config.Quantile) + delay := time.Duration(delayMs) * time.Millisecond + upto := int(hrt.config.UpTo) + return upto, delay +} + +func CreateHedgedTransportWithConfig(config CustomBucketConfig) func(rt http.RoundTripper) http.RoundTripper { + if !config.HedgingConfig.Enabled { + return func(rt http.RoundTripper) http.RoundTripper { + return rt + } + } + return func(rt http.RoundTripper) http.RoundTripper { + td, err := tdigest.New() + if err != nil { + panic(fmt.Sprintf("BUG: Failed to initialize T-Digest: %v", err)) + } + hrt := &hedgingRoundTripper{ + Transport: rt, + TDigest: td, + config: config.HedgingConfig, + } + cfg := hedgedhttp.Config{ + Transport: hrt, + Upto: int(config.HedgingConfig.UpTo), + Next: hrt.nextFn, + } + hedgedrt, err := hedgedhttp.New(cfg) + if err != nil { + panic(fmt.Sprintf("BUG: Failed to create hedged transport: %v", err)) + } + return hedgedrt + } +} diff --git a/pkg/extprom/http/instrument_client.go b/pkg/extprom/http/instrument_client.go index 75d33243c7..ebdda5fbe1 100644 --- a/pkg/extprom/http/instrument_client.go +++ b/pkg/extprom/http/instrument_client.go @@ -27,6 +27,8 @@ type ClientMetrics struct { // e.g. 1 ClientMetrics should be used for all the clients that talk to Alertmanager. func NewClientMetrics(reg prometheus.Registerer) *ClientMetrics { var m ClientMetrics + const maxBucketNumber = 256 + const bucketFactor = 1.1 m.inFlightGauge = promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Subsystem: "http_client", @@ -46,6 +48,9 @@ func NewClientMetrics(reg prometheus.Registerer) *ClientMetrics { Name: "dns_duration_seconds", Help: "Trace dns latency histogram.", Buckets: []float64{0.025, .05, .1, .5, 1, 5, 10}, + + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBucketNumber, }, []string{"event"}, ) @@ -56,6 +61,9 @@ func NewClientMetrics(reg prometheus.Registerer) *ClientMetrics { Name: "tls_duration_seconds", Help: "Trace tls latency histogram.", Buckets: []float64{0.025, .05, .1, .5, 1, 5, 10}, + + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBucketNumber, }, []string{"event"}, ) @@ -66,6 +74,9 @@ func NewClientMetrics(reg prometheus.Registerer) *ClientMetrics { Name: "request_duration_seconds", Help: "A histogram of request latencies.", Buckets: []float64{0.025, .05, .1, .5, 1, 5, 10}, + + NativeHistogramBucketFactor: bucketFactor, + NativeHistogramMaxBucketNumber: maxBucketNumber, }, []string{"code", "method"}, ) diff --git a/pkg/extpromql/parser.go b/pkg/extpromql/parser.go new file mode 100644 index 0000000000..a4e92e9c55 --- /dev/null +++ b/pkg/extpromql/parser.go @@ -0,0 +1,57 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package extpromql + +import ( + "fmt" + "strings" + + "github.com/pkg/errors" + "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/promql/parser" + + "github.com/thanos-io/promql-engine/execution/function" +) + +// ParseExpr parses the input PromQL expression and returns the parsed representation. +func ParseExpr(input string) (parser.Expr, error) { + allFuncs := make(map[string]*parser.Function, len(function.XFunctions)+len(parser.Functions)) + for k, v := range parser.Functions { + allFuncs[k] = v + } + for k, v := range function.XFunctions { + allFuncs[k] = v + } + p := parser.NewParser(input, parser.WithFunctions(allFuncs)) + defer p.Close() + return p.ParseExpr() +} + +// ParseMetricSelector parses the provided textual metric selector into a list of +// label matchers. +func ParseMetricSelector(input string) ([]*labels.Matcher, error) { + expr, err := ParseExpr(input) + // because of the AST checking present in the ParseExpr function, + // we need to ignore the error if it is just the check for empty name matcher. + if err != nil && !isEmptyNameMatcherErr(err) { + return nil, err + } + + vs, ok := expr.(*parser.VectorSelector) + if !ok { + return nil, fmt.Errorf("expected type *parser.VectorSelector, got %T", expr) + } + + return vs.LabelMatchers, nil +} + +func isEmptyNameMatcherErr(err error) bool { + var parseErrs parser.ParseErrors + if errors.As(err, &parseErrs) { + return len(parseErrs) == 1 && + strings.HasSuffix(parseErrs[0].Error(), "vector selector must contain at least one non-empty matcher") + } + + return false +} diff --git a/pkg/extpromql/parser_test.go b/pkg/extpromql/parser_test.go new file mode 100644 index 0000000000..72ef7b26cb --- /dev/null +++ b/pkg/extpromql/parser_test.go @@ -0,0 +1,68 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package extpromql_test + +import ( + "fmt" + "testing" + + "github.com/efficientgo/core/testutil" + "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/promql/parser" + + "github.com/thanos-io/thanos/pkg/extpromql" +) + +func TestParseMetricSelector(t *testing.T) { + testCases := []struct { + name string + input string + }{ + { + name: "single selector", + input: `http_requests_total{method="GET"}`, + }, + { + name: "empty selectors", + input: `process_cpu_seconds_total`, + }, + { + name: "multiple selectors", + input: `http_requests_total{method="GET",code="200"}`, + }, + { + name: "multiple selectors with different matchers", + input: `http_requests_total{method="GET",code!="200"}`, + }, + { + name: "multiple selectors with regex", + input: `http_requests_total{method="GET",code=~"2.*"}`, + }, + { + name: "selector with negative regex", + input: `{code!~"2.*"}`, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + //lint:ignore faillint Testing against prometheus parser. + want, err := parser.ParseMetricSelector(tc.input) + if err != nil { + t.Fatalf("Prometheus ParseMetricSelector failed: %v", err) + } + + got, err := extpromql.ParseMetricSelector(tc.input) + if err != nil { + t.Fatalf("ParseMetricSelector failed: %v", err) + } + + testutil.Equals(t, stringFmt(want), stringFmt(got)) + }) + } +} + +func stringFmt(got []*labels.Matcher) string { + return fmt.Sprintf("%v", got) +} diff --git a/pkg/filter/cuckoo.go b/pkg/filter/cuckoo.go new file mode 100644 index 0000000000..0cdce6dc94 --- /dev/null +++ b/pkg/filter/cuckoo.go @@ -0,0 +1,45 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package filter + +import ( + "sync" + "unsafe" + + "github.com/prometheus/prometheus/model/labels" + cuckoo "github.com/seiflotfy/cuckoofilter" +) + +type CuckooMetricNameStoreFilter struct { + filter *cuckoo.Filter + mtx sync.RWMutex +} + +func NewCuckooMetricNameStoreFilter(capacity uint) *CuckooMetricNameStoreFilter { + return &CuckooMetricNameStoreFilter{ + filter: cuckoo.NewFilter(capacity), + } +} + +func (f *CuckooMetricNameStoreFilter) Matches(matchers []*labels.Matcher) bool { + f.mtx.RLock() + defer f.mtx.RUnlock() + + for _, m := range matchers { + if m.Type == labels.MatchEqual && m.Name == labels.MetricName { + return f.filter.Lookup([]byte(m.Value)) + } + } + + return true +} + +func (f *CuckooMetricNameStoreFilter) ResetAndSet(values ...string) { + f.mtx.Lock() + defer f.mtx.Unlock() + f.filter.Reset() + for _, value := range values { + f.filter.Insert(unsafe.Slice(unsafe.StringData(value), len(value))) + } +} diff --git a/pkg/filter/filter.go b/pkg/filter/filter.go new file mode 100644 index 0000000000..f5cc068cf5 --- /dev/null +++ b/pkg/filter/filter.go @@ -0,0 +1,22 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package filter + +import "github.com/prometheus/prometheus/model/labels" + +type StoreFilter interface { + // Matches returns true if the filter matches the given matchers. + Matches(matchers []*labels.Matcher) bool + + // ResetAndSet resets the filter and sets it to the given values. + ResetAndSet(values ...string) +} + +type AllowAllStoreFilter struct{} + +func (f AllowAllStoreFilter) Matches(matchers []*labels.Matcher) bool { + return true +} + +func (f AllowAllStoreFilter) ResetAndSet(values ...string) {} diff --git a/pkg/logging/grpc.go b/pkg/logging/grpc.go index 44387d395f..1aeeafd2fe 100644 --- a/pkg/logging/grpc.go +++ b/pkg/logging/grpc.go @@ -4,17 +4,12 @@ package logging import ( + "context" "fmt" - "math/rand" - "sort" - "strings" - "time" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors" + "github.com/go-kit/log" + "github.com/go-kit/log/level" grpc_logging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" - "github.com/oklog/ulid" - "google.golang.org/grpc/status" "gopkg.in/yaml.v2" ) @@ -79,17 +74,17 @@ func fillGlobalOptionConfig(reqLogConfig *RequestConfig, isgRPC bool) (string, b } // getGRPCLoggingOption returns the logging ENUM based on logStart and logEnd values. -func getGRPCLoggingOption(logStart, logEnd bool) (grpc_logging.Decision, error) { +func getGRPCLoggingOption(logStart, logEnd bool) (grpc_logging.Option, error) { if !logStart && !logEnd { - return grpc_logging.NoLogCall, nil + return grpc_logging.WithLogOnEvents(), nil } if !logStart && logEnd { - return grpc_logging.LogFinishCall, nil + return grpc_logging.WithLogOnEvents(grpc_logging.FinishCall), nil } if logStart && logEnd { - return grpc_logging.LogStartAndFinishCall, nil + return grpc_logging.WithLogOnEvents(grpc_logging.StartCall, grpc_logging.FinishCall), nil } - return -1, fmt.Errorf("log start call is not supported") + return nil, fmt.Errorf("log decision combination is not supported") } // validateLevel validates the list of level entries. @@ -104,104 +99,79 @@ func validateLevel(level string) error { return fmt.Errorf("the format of level is invalid. Expected INFO/DEBUG/ERROR/WARNING, got this %v", level) } -// NewGRPCOption adds in the config options and returns tags for logging middleware. -func NewGRPCOption(configYAML []byte) ([]tags.Option, []grpc_logging.Option, error) { - - // Configure tagOpts and logOpts. - tagOpts := []tags.Option{ - tags.WithFieldExtractor(func(_ string, req interface{}) map[string]string { - tagMap := tags.TagBasedRequestFieldExtractor("request-id")("", req) - // If a request-id exists for a given request. - if tagMap != nil { - if _, ok := tagMap["request-id"]; ok { - return tagMap - } - } - entropy := ulid.Monotonic(rand.New(rand.NewSource(time.Now().UnixNano())), 0) - reqID := ulid.MustNew(ulid.Timestamp(time.Now()), entropy) - tagMap = make(map[string]string) - tagMap["request-id"] = reqID.String() - return tagMap - }), - } - logOpts := []grpc_logging.Option{ - grpc_logging.WithDecider(func(_ string, _ error) grpc_logging.Decision { - return grpc_logging.NoLogCall - }), - grpc_logging.WithLevels(DefaultCodeToLevelGRPC), - } +func InterceptorLogger(l log.Logger) grpc_logging.Logger { + return grpc_logging.LoggerFunc(func(_ context.Context, lvl grpc_logging.Level, msg string, fields ...any) { + largs := append([]any{"msg", msg}, fields...) + switch lvl { + case grpc_logging.LevelDebug: + _ = level.Debug(l).Log(largs...) + case grpc_logging.LevelInfo: + _ = level.Info(l).Log(largs...) + case grpc_logging.LevelWarn: + _ = level.Warn(l).Log(largs...) + case grpc_logging.LevelError: + _ = level.Error(l).Log(largs...) + default: + panic(fmt.Sprintf("unknown level %v", lvl)) + } + }) +} - // Unmarshal YAML. +// NewGRPCOption adds in the config options for logging middleware. +func NewGRPCOption(configYAML []byte) ([]grpc_logging.Option, []string, error) { + + var logOpts []grpc_logging.Option + + // Unmarshal YAML // if req logging is disabled. if len(configYAML) == 0 { - return tagOpts, logOpts, nil + return nil, nil, nil } reqLogConfig, err := NewRequestConfig(configYAML) // If unmarshalling is an issue. if err != nil { - return tagOpts, logOpts, err + return logOpts, nil, err } globalLevel, globalStart, globalEnd, err := fillGlobalOptionConfig(reqLogConfig, true) // If global options have invalid entries. if err != nil { - return tagOpts, logOpts, err + return logOpts, nil, err + } + if !globalStart && !globalEnd { + //Nothing to do + return nil, nil, nil } // If the level entry does not matches our entries. if err := validateLevel(globalLevel); err != nil { - return tagOpts, logOpts, err + return logOpts, nil, err } + logOpts = []grpc_logging.Option{ + grpc_logging.WithLevels(DefaultCodeToLevelGRPC), + grpc_logging.WithFieldsFromContext(GetTraceIDAndRequestIDAsField), + } // If the combination is valid, use them, otherwise return error. reqLogDecision, err := getGRPCLoggingOption(globalStart, globalEnd) if err != nil { - return tagOpts, logOpts, err + return logOpts, nil, err } if len(reqLogConfig.GRPC.Config) == 0 { - logOpts = []grpc_logging.Option{ - grpc_logging.WithDecider(func(_ string, err error) grpc_logging.Decision { - - runtimeLevel := grpc_logging.DefaultServerCodeToLevel(status.Code(err)) - for _, lvl := range MapAllowedLevels[globalLevel] { - if string(runtimeLevel) == strings.ToLower(lvl) { - return reqLogDecision - } - } - return grpc_logging.NoLogCall - }), - grpc_logging.WithLevels(DefaultCodeToLevelGRPC), - } - return tagOpts, logOpts, nil - } - - logOpts = []grpc_logging.Option{ - grpc_logging.WithLevels(DefaultCodeToLevelGRPC), + // If no config is present, use the global config. + logOpts = append(logOpts, reqLogDecision) + return logOpts, nil, nil } - methodNameSlice := []string{} + logOpts = append(logOpts, reqLogDecision) + var methodNameSlice []string for _, eachConfig := range reqLogConfig.GRPC.Config { - eachConfigMethodName := interceptors.FullMethod(eachConfig.Service, eachConfig.Method) + eachConfigMethodName := fmt.Sprintf("/%s/%s", eachConfig.Service, eachConfig.Method) methodNameSlice = append(methodNameSlice, eachConfigMethodName) } - logOpts = append(logOpts, []grpc_logging.Option{ - grpc_logging.WithDecider(func(runtimeMethodName string, err error) grpc_logging.Decision { - - idx := sort.SearchStrings(methodNameSlice, runtimeMethodName) - if idx < len(methodNameSlice) && methodNameSlice[idx] == runtimeMethodName { - runtimeLevel := grpc_logging.DefaultServerCodeToLevel(status.Code(err)) - for _, lvl := range MapAllowedLevels[globalLevel] { - if string(runtimeLevel) == strings.ToLower(lvl) { - return reqLogDecision - } - } - } - return grpc_logging.NoLogCall - }), - }...) - return tagOpts, logOpts, nil + return logOpts, methodNameSlice, nil } diff --git a/pkg/logging/options.go b/pkg/logging/options.go index 85eed878c0..2b4ed3190e 100644 --- a/pkg/logging/options.go +++ b/pkg/logging/options.go @@ -4,14 +4,20 @@ package logging import ( + "context" "fmt" "time" + "github.com/oklog/ulid" + "github.com/opentracing/opentracing-go" + "go.opentelemetry.io/otel/trace" + extflag "github.com/efficientgo/tools/extkingpin" "github.com/go-kit/log" "github.com/go-kit/log/level" grpc_logging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" + middleware "github.com/thanos-io/thanos/pkg/server/http/middleware" + "github.com/thanos-io/thanos/pkg/tracing/migration" "google.golang.org/grpc/codes" ) @@ -127,9 +133,9 @@ func DefaultCodeToLevel(logger log.Logger, code int) log.Logger { func DefaultCodeToLevelGRPC(c codes.Code) grpc_logging.Level { switch c { case codes.Unknown, codes.Unimplemented, codes.Internal, codes.DataLoss: - return grpc_logging.ERROR + return grpc_logging.LevelError default: - return grpc_logging.DEBUG + return grpc_logging.LevelDebug } } @@ -158,6 +164,33 @@ var MapAllowedLevels = map[string][]string{ "WARN": {"WARN", "ERROR"}, } +func GetTraceIDAndRequestIDAsField(ctx context.Context) grpc_logging.Fields { + logFields := grpc_logging.Fields{} + + //get traceID from context + span := opentracing.SpanFromContext(ctx) + TraceID, _ := migration.GetTraceIDFromBridgeSpan(span) + if span := trace.SpanContextFromContext(ctx); span.IsSampled() { + logFields = logFields.AppendUnique(grpc_logging.Fields{"traceID", TraceID}) + } + //get requestID from context + reqID, ok := middleware.RequestIDFromContext(ctx) + if ok { + logFields = logFields.AppendUnique(grpc_logging.Fields{"requestID", reqID}) + return logFields + } + + entropy := ulid.Monotonic(rand.New(rand.NewSource(time.Now().UnixNano())), 0) + newReqID := ulid.MustNew(ulid.Timestamp(time.Now()), entropy).String() + logFields = logFields.AppendUnique(grpc_logging.Fields{"requestID", newReqID}) + + // Insert into context (Note: This updated context isn't being used later, so this might be redundant) + _ = middleware.NewContextWithRequestID(ctx, newReqID) + + return logFields + +} + // TODO: @yashrsharma44 - To be deprecated in the next release. func ParseHTTPOptions(reqLogConfig *extflag.PathOrContent) ([]Option, error) { // Default Option: No Logging. @@ -175,21 +208,17 @@ func ParseHTTPOptions(reqLogConfig *extflag.PathOrContent) ([]Option, error) { } // TODO: @yashrsharma44 - To be deprecated in the next release. -func ParsegRPCOptions(reqLogConfig *extflag.PathOrContent) ([]tags.Option, []grpc_logging.Option, error) { - // Default Option: No Logging. - logOpts := []grpc_logging.Option{grpc_logging.WithDecider(func(_ string, _ error) grpc_logging.Decision { - return grpc_logging.NoLogCall - })} - +func ParsegRPCOptions(reqLogConfig *extflag.PathOrContent) ([]grpc_logging.Option, []string, error) { + var logOpts []grpc_logging.Option configYAML, err := reqLogConfig.Content() if err != nil { - return []tags.Option{}, logOpts, fmt.Errorf("getting request logging config failed. %v", err) + return logOpts, nil, fmt.Errorf("getting request logging config failed. %v", err) } - tagOpts, logOpts, err := NewGRPCOption(configYAML) + logOpts, logFilterMethods, err := NewGRPCOption(configYAML) if err != nil { - return []tags.Option{}, logOpts, err + return logOpts, logFilterMethods, err } - return tagOpts, logOpts, nil + return logOpts, logFilterMethods, nil } diff --git a/pkg/pool/pool.go b/pkg/pool/pool.go index 159966d0cb..f3481257f2 100644 --- a/pkg/pool/pool.go +++ b/pkg/pool/pool.go @@ -9,51 +9,52 @@ import ( "github.com/pkg/errors" ) -// Bytes is a pool of bytes that can be reused. -type Bytes interface { - // Get returns a new byte slices that fits the given size. - Get(sz int) (*[]byte, error) - // Put returns a byte slice to the right bucket in the pool. - Put(b *[]byte) +// Pool is a pool for slices of type T that can be reused. +type Pool[T any] interface { + // Get returns a new T slice that fits the given size. + Get(sz int) (*[]T, error) + // Put returns a T slice to the right bucket in the pool. + Put(b *[]T) } -// NoopBytes is pool that always allocated required slice on heap and ignore puts. -type NoopBytes struct{} +// NoopPool is pool that always allocated required slice on heap and ignore puts. +type NoopPool[T any] struct{} -func (p NoopBytes) Get(sz int) (*[]byte, error) { - b := make([]byte, 0, sz) +func (p NoopPool[T]) Get(sz int) (*[]T, error) { + b := make([]T, 0, sz) return &b, nil } -func (p NoopBytes) Put(*[]byte) {} +func (p NoopPool[T]) Put(*[]T) {} -// BucketedBytes is a bucketed pool for variably sized byte slices. It can be configured to not allow -// more than a maximum number of bytes being used at a given time. -// Every byte slice obtained from the pool must be returned. -type BucketedBytes struct { +// BucketedPool is a bucketed pool for variably sized T slices. It can be +// configured to not allow more than a maximum number of T items being used at a +// given time. Every slice obtained from the pool must be returned. +type BucketedPool[T any] struct { buckets []sync.Pool sizes []int maxTotal uint64 usedTotal uint64 mtx sync.RWMutex - new func(s int) *[]byte + new func(s int) *[]T } -// MustNewBucketedBytes is like NewBucketedBytes but panics if construction fails. +// MustNewBucketedPool is like NewBucketedPool but panics if construction fails. // Useful for package internal pools. -func MustNewBucketedBytes(minSize, maxSize int, factor float64, maxTotal uint64) *BucketedBytes { - pool, err := NewBucketedBytes(minSize, maxSize, factor, maxTotal) +func MustNewBucketedPool[T any](minSize, maxSize int, factor float64, maxTotal uint64) *BucketedPool[T] { + pool, err := NewBucketedPool[T](minSize, maxSize, factor, maxTotal) if err != nil { panic(err) } return pool } -// NewBucketedBytes returns a new Bytes with size buckets for minSize to maxSize -// increasing by the given factor and maximum number of used bytes. -// No more than maxTotal bytes can be used at any given time unless maxTotal is set to 0. -func NewBucketedBytes(minSize, maxSize int, factor float64, maxTotal uint64) (*BucketedBytes, error) { +// NewBucketedPool returns a new BucketedPool with size buckets for minSize to +// maxSize increasing by the given factor and maximum number of used items. No +// more than maxTotal items can be used at any given time unless maxTotal is set +// to 0. +func NewBucketedPool[T any](minSize, maxSize int, factor float64, maxTotal uint64) (*BucketedPool[T], error) { if minSize < 1 { return nil, errors.New("invalid minimum pool size") } @@ -69,23 +70,23 @@ func NewBucketedBytes(minSize, maxSize int, factor float64, maxTotal uint64) (*B for s := minSize; s <= maxSize; s = int(float64(s) * factor) { sizes = append(sizes, s) } - p := &BucketedBytes{ + p := &BucketedPool[T]{ buckets: make([]sync.Pool, len(sizes)), sizes: sizes, maxTotal: maxTotal, - new: func(sz int) *[]byte { - s := make([]byte, 0, sz) + new: func(sz int) *[]T { + s := make([]T, 0, sz) return &s }, } return p, nil } -// ErrPoolExhausted is returned if a pool cannot provide the request bytes. +// ErrPoolExhausted is returned if a pool cannot provide the requested slice. var ErrPoolExhausted = errors.New("pool exhausted") -// Get returns a new byte slice that fits the given size. -func (p *BucketedBytes) Get(sz int) (*[]byte, error) { +// Get returns a slice into from the bucket that fits the given size. +func (p *BucketedPool[T]) Get(sz int) (*[]T, error) { p.mtx.Lock() defer p.mtx.Unlock() @@ -97,7 +98,7 @@ func (p *BucketedBytes) Get(sz int) (*[]byte, error) { if sz > bktSize { continue } - b, ok := p.buckets[i].Get().(*[]byte) + b, ok := p.buckets[i].Get().(*[]T) if !ok { b = p.new(bktSize) } @@ -111,8 +112,8 @@ func (p *BucketedBytes) Get(sz int) (*[]byte, error) { return p.new(sz), nil } -// Put returns a byte slice to the right bucket in the pool. -func (p *BucketedBytes) Put(b *[]byte) { +// Put returns a slice to the right bucket in the pool. +func (p *BucketedPool[T]) Put(b *[]T) { if b == nil { return } @@ -138,7 +139,7 @@ func (p *BucketedBytes) Put(b *[]byte) { } } -func (p *BucketedBytes) UsedBytes() uint64 { +func (p *BucketedPool[T]) UsedBytes() uint64 { p.mtx.RLock() defer p.mtx.RUnlock() diff --git a/pkg/pool/pool_test.go b/pkg/pool/pool_test.go index 524592bf48..5d7791e3ae 100644 --- a/pkg/pool/pool_test.go +++ b/pkg/pool/pool_test.go @@ -20,7 +20,7 @@ func TestMain(m *testing.M) { } func TestBytesPool(t *testing.T) { - chunkPool, err := NewBucketedBytes(10, 100, 2, 1000) + chunkPool, err := NewBucketedPool[byte](10, 100, 2, 1000) testutil.Ok(t, err) testutil.Equals(t, []int{10, 20, 40, 80}, chunkPool.sizes) @@ -65,7 +65,7 @@ func TestBytesPool(t *testing.T) { } func TestRacePutGet(t *testing.T) { - chunkPool, err := NewBucketedBytes(3, 100, 2, 5000) + chunkPool, err := NewBucketedPool[byte](3, 100, 2, 5000) testutil.Ok(t, err) s := sync.WaitGroup{} diff --git a/pkg/prober/grpc.go b/pkg/prober/grpc.go index 6151e04033..9349a95d7f 100644 --- a/pkg/prober/grpc.go +++ b/pkg/prober/grpc.go @@ -13,7 +13,7 @@ type GRPCProbe struct { h *health.Server } -// NewGRPC creates a Probe that wrapped around grpc/healt.Server which reflects status of server. +// NewGRPC creates a Probe that wrapped around grpc/health.Server which reflects status of server. func NewGRPC() *GRPCProbe { h := health.NewServer() h.SetServingStatus("", grpc_health.HealthCheckResponse_NOT_SERVING) diff --git a/pkg/promclient/promclient.go b/pkg/promclient/promclient.go index 5dde62c5ee..b655ea1ab1 100644 --- a/pkg/promclient/promclient.go +++ b/pkg/promclient/promclient.go @@ -10,6 +10,7 @@ import ( "encoding/json" "fmt" "io" + "math" "net/http" "net/url" "os" @@ -24,8 +25,8 @@ import ( "github.com/go-kit/log/level" "github.com/gogo/status" "github.com/pkg/errors" + "github.com/prometheus/common/expfmt" "github.com/prometheus/common/model" - "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/model/timestamp" "github.com/prometheus/prometheus/promql" @@ -199,13 +200,15 @@ func (c *Client) ExternalLabels(ctx context.Context, base *url.URL) (labels.Labe return labels.EmptyLabels(), errors.Wrapf(err, "unmarshal response: %v", string(body)) } var cfg struct { - GlobalConfig config.GlobalConfig `yaml:"global"` + GlobalConfig struct { + ExternalLabels map[string]string `yaml:"external_labels"` + } `yaml:"global"` } if err := yaml.Unmarshal([]byte(d.Data.YAML), &cfg); err != nil { return labels.EmptyLabels(), errors.Wrapf(err, "parse Prometheus config: %v", d.Data.YAML) } - return cfg.GlobalConfig.ExternalLabels, nil + return labels.FromMap(cfg.GlobalConfig.ExternalLabels), nil } type Flags struct { @@ -687,6 +690,48 @@ func (c *Client) BuildVersion(ctx context.Context, base *url.URL) (string, error return b.Data.Version, nil } +// LowestTimestamp returns the lowest timestamp in the TSDB by parsing the /metrics endpoint +// and extracting the prometheus_tsdb_lowest_timestamp_seconds metric from it. +func (c *Client) LowestTimestamp(ctx context.Context, base *url.URL) (int64, error) { + u := *base + u.Path = path.Join(u.Path, "/metrics") + + level.Debug(c.logger).Log("msg", "lowest timestamp", "url", u.String()) + + req, err := http.NewRequest(http.MethodGet, u.String(), nil) + if err != nil { + return 0, errors.Wrap(err, "create request") + } + + span, ctx := tracing.StartSpan(ctx, "/lowest_timestamp HTTP[client]") + defer span.Finish() + + resp, err := c.Do(req.WithContext(ctx)) + if err != nil { + return 0, errors.Wrapf(err, "request metric against %s", u.String()) + } + defer runutil.ExhaustCloseWithLogOnErr(c.logger, resp.Body, "request body") + + var parser expfmt.TextParser + families, err := parser.TextToMetricFamilies(resp.Body) + if err != nil { + return 0, errors.Wrapf(err, "parsing metric families against %s", u.String()) + } + mf, ok := families["prometheus_tsdb_lowest_timestamp_seconds"] + if !ok { + return 0, errors.Wrapf(err, "metric families did not contain 'prometheus_tsdb_lowest_timestamp_seconds'") + } + val := 1000 * mf.GetMetric()[0].GetGauge().GetValue() + + // in the case that we dont have cut a block yet, TSDB lowest timestamp is math.MaxInt64 + // but its represented as float and truncated so we need to do this weird comparison. + // Since we use this for fan-out pruning we use min timestamp here to include this prometheus. + if val == float64(math.MaxInt64) { + return math.MinInt64, nil + } + return int64(val), nil +} + func formatTime(t time.Time) string { return strconv.FormatFloat(float64(t.Unix())+float64(t.Nanosecond())/1e9, 'f', -1, 64) } @@ -734,7 +779,7 @@ func (c *Client) get2xxResultWithGRPCErrors(ctx context.Context, spanName string // SeriesInGRPC returns the labels from Prometheus series API. It uses gRPC errors. // NOTE: This method is tested in pkg/store/prometheus_test.go against Prometheus. -func (c *Client) SeriesInGRPC(ctx context.Context, base *url.URL, matchers []*labels.Matcher, startTime, endTime int64) ([]map[string]string, error) { +func (c *Client) SeriesInGRPC(ctx context.Context, base *url.URL, matchers []*labels.Matcher, startTime, endTime int64, limit int) ([]map[string]string, error) { u := *base u.Path = path.Join(u.Path, "/api/v1/series") q := u.Query() @@ -742,6 +787,9 @@ func (c *Client) SeriesInGRPC(ctx context.Context, base *url.URL, matchers []*la q.Add("match[]", storepb.PromMatchersToString(matchers...)) q.Add("start", formatTime(timestamp.Time(startTime))) q.Add("end", formatTime(timestamp.Time(endTime))) + if limit > 0 { + q.Add("limit", strconv.Itoa(limit)) + } u.RawQuery = q.Encode() var m struct { @@ -753,7 +801,7 @@ func (c *Client) SeriesInGRPC(ctx context.Context, base *url.URL, matchers []*la // LabelNamesInGRPC returns all known label names constrained by the given matchers. It uses gRPC errors. // NOTE: This method is tested in pkg/store/prometheus_test.go against Prometheus. -func (c *Client) LabelNamesInGRPC(ctx context.Context, base *url.URL, matchers []*labels.Matcher, startTime, endTime int64) ([]string, error) { +func (c *Client) LabelNamesInGRPC(ctx context.Context, base *url.URL, matchers []*labels.Matcher, startTime, endTime int64, limit int) ([]string, error) { u := *base u.Path = path.Join(u.Path, "/api/v1/labels") q := u.Query() @@ -763,6 +811,9 @@ func (c *Client) LabelNamesInGRPC(ctx context.Context, base *url.URL, matchers [ } q.Add("start", formatTime(timestamp.Time(startTime))) q.Add("end", formatTime(timestamp.Time(endTime))) + if limit > 0 { + q.Add("limit", strconv.Itoa(limit)) + } u.RawQuery = q.Encode() var m struct { @@ -773,7 +824,7 @@ func (c *Client) LabelNamesInGRPC(ctx context.Context, base *url.URL, matchers [ // LabelValuesInGRPC returns all known label values for a given label name. It uses gRPC errors. // NOTE: This method is tested in pkg/store/prometheus_test.go against Prometheus. -func (c *Client) LabelValuesInGRPC(ctx context.Context, base *url.URL, label string, matchers []*labels.Matcher, startTime, endTime int64) ([]string, error) { +func (c *Client) LabelValuesInGRPC(ctx context.Context, base *url.URL, label string, matchers []*labels.Matcher, startTime, endTime int64, limit int) ([]string, error) { u := *base u.Path = path.Join(u.Path, "/api/v1/label/", label, "/values") q := u.Query() @@ -783,6 +834,9 @@ func (c *Client) LabelValuesInGRPC(ctx context.Context, base *url.URL, label str } q.Add("start", formatTime(timestamp.Time(startTime))) q.Add("end", formatTime(timestamp.Time(endTime))) + if limit > 0 { + q.Add("limit", strconv.Itoa(limit)) + } u.RawQuery = q.Encode() var m struct { @@ -850,7 +904,6 @@ func (c *Client) MetricMetadataInGRPC(ctx context.Context, base *url.URL, metric if metric != "" { q.Add("metric", metric) } - // We only set limit when it is >= 0. if limit >= 0 { q.Add("limit", strconv.Itoa(limit)) } diff --git a/pkg/promclient/promclient_e2e_test.go b/pkg/promclient/promclient_e2e_test.go index fec2b46b34..409f1e5148 100644 --- a/pkg/promclient/promclient_e2e_test.go +++ b/pkg/promclient/promclient_e2e_test.go @@ -6,6 +6,7 @@ package promclient import ( "context" "fmt" + "math" "net/url" "os" "path" @@ -42,10 +43,10 @@ func TestIsWALFileAccessible_e2e(t *testing.T) { func TestExternalLabels_e2e(t *testing.T) { e2eutil.ForeachPrometheus(t, func(t testing.TB, p *e2eutil.Prometheus) { // Keep consistent with the config processing in function (*Client).ExternalLabels. - cfg := config.Config{GlobalConfig: config.GlobalConfig{ExternalLabels: []labels.Label{ - {Name: "region", Value: "eu-west"}, - {Name: "az", Value: "1"}, - }}} + cfg := config.Config{GlobalConfig: config.GlobalConfig{ExternalLabels: labels.FromMap(map[string]string{ + "region": "eu-west", + "az": "1", + })}} cfgData, err := yaml.Marshal(cfg) testutil.Ok(t, err) p.SetConfig(string(cfgData)) @@ -58,7 +59,7 @@ func TestExternalLabels_e2e(t *testing.T) { ext, err := NewDefaultClient().ExternalLabels(context.Background(), u) testutil.Ok(t, err) - testutil.Equals(t, 2, len(ext)) + testutil.Equals(t, 2, ext.Len()) testutil.Equals(t, "eu-west", ext.Get("region")) testutil.Equals(t, "1", ext.Get("az")) }) @@ -83,6 +84,20 @@ func TestConfiguredFlags_e2e(t *testing.T) { }) } +func TestLowestTimestamp_e2e(t *testing.T) { + e2eutil.ForeachPrometheus(t, func(t testing.TB, p *e2eutil.Prometheus) { + testutil.Ok(t, p.Start(context.Background(), log.NewNopLogger())) + + u, err := url.Parse(fmt.Sprintf("http://%s", p.Addr())) + testutil.Ok(t, err) + + ts, err := NewDefaultClient().LowestTimestamp(context.Background(), u) + testutil.Ok(t, err) + + testutil.Equals(t, math.MinInt64, int(ts)) + }) +} + func TestSnapshot_e2e(t *testing.T) { e2eutil.ForeachPrometheus(t, func(t testing.TB, p *e2eutil.Prometheus) { now := time.Now() @@ -96,7 +111,7 @@ func TestSnapshot_e2e(t *testing.T) { 10, timestamp.FromTime(now.Add(-6*time.Hour)), timestamp.FromTime(now.Add(-4*time.Hour)), - nil, + labels.EmptyLabels(), 0, metadata.NoneFunc, ) @@ -167,7 +182,7 @@ func TestQueryRange_e2e(t *testing.T) { 10, timestamp.FromTime(now.Add(-2*time.Hour)), timestamp.FromTime(now), - nil, + labels.EmptyLabels(), 0, metadata.NoneFunc, ) diff --git a/pkg/promclient/promclient_test.go b/pkg/promclient/promclient_test.go new file mode 100644 index 0000000000..00173d3302 --- /dev/null +++ b/pkg/promclient/promclient_test.go @@ -0,0 +1,67 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +// Package promclient offers helper client function for various API endpoints. + +package promclient + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "testing" + + "github.com/efficientgo/core/testutil" +) + +func TestExternalLabels(t *testing.T) { + for _, tc := range []struct { + name string + response string + err bool + labels map[string]string + }{ + { + name: "invalid payload", + response: `{`, + err: true, + }, + { + name: "unknown scrape protocol", + response: `{"status":"success","data":{"yaml":"global:\n scrape_interval: 1m\n scrape_timeout: 10s\n scrape_protocols:\n - OpenMetricsText1.0.0\n - OpenMetricsText0.0.1\n - PrometheusText1.0.0\n - PrometheusText0.0.4\n - UnknownScrapeProto\n evaluation_interval: 1m\n external_labels:\n az: \"1\"\n region: eu-west\nruntime:\n gogc: 75\n"}}`, + labels: map[string]string{ + "region": "eu-west", + "az": "1", + }, + }, + { + name: "no external labels", + response: `{"status":"success","data":{"yaml":"global:\n scrape_interval: 1m\n scrape_timeout: 10s\n scrape_protocols:\n - OpenMetricsText1.0.0\n - OpenMetricsText0.0.1\n - PrometheusText1.0.0\n - PrometheusText0.0.4\n - UnknownScrapeProto\n evaluation_interval: 1m\nruntime:\n gogc: 75\n"}}`, + labels: map[string]string{}, + }, + } { + t.Run(tc.name, func(t *testing.T) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, tc.response) + })) + defer ts.Close() + + u, err := url.Parse(ts.URL) + testutil.Ok(t, err) + + ext, err := NewDefaultClient().ExternalLabels(context.Background(), u) + if tc.err { + testutil.NotOk(t, err) + return + } + + testutil.Ok(t, err) + testutil.Equals(t, len(tc.labels), ext.Len()) + for k, v := range tc.labels { + testutil.Equals(t, v, ext.Get(k)) + } + }) + } +} diff --git a/pkg/query/endpointset.go b/pkg/query/endpointset.go index 6dbf8c85cb..4c519bf925 100644 --- a/pkg/query/endpointset.go +++ b/pkg/query/endpointset.go @@ -83,91 +83,9 @@ func (es *endpointRef) Metadata(ctx context.Context, infoClient infopb.InfoClien return &endpointMetadata{resp}, nil } } - - // Call Info method of StoreAPI, this way querier will be able to discovery old components not exposing InfoAPI. - if storeClient != nil { - metadata, err := es.getMetadataUsingStoreAPI(ctx, storeClient) - if err != nil { - return nil, errors.Wrapf(err, "fallback fetching info from %s", es.addr) - } - return metadata, nil - } - return nil, errors.New(noMetadataEndpointMessage) } -func (es *endpointRef) getMetadataUsingStoreAPI(ctx context.Context, client storepb.StoreClient) (*endpointMetadata, error) { - resp, err := client.Info(ctx, &storepb.InfoRequest{}) - if err != nil { - return nil, err - } - - infoResp := fillExpectedAPIs(component.FromProto(resp.StoreType), resp.MinTime, resp.MaxTime) - infoResp.LabelSets = resp.LabelSets - infoResp.ComponentType = component.FromProto(resp.StoreType).String() - - return &endpointMetadata{ - &infoResp, - }, nil -} - -func fillExpectedAPIs(componentType component.Component, mintime, maxTime int64) infopb.InfoResponse { - switch componentType { - case component.Sidecar: - return infopb.InfoResponse{ - Store: &infopb.StoreInfo{ - MinTime: mintime, - MaxTime: maxTime, - }, - Rules: &infopb.RulesInfo{}, - Targets: &infopb.TargetsInfo{}, - MetricMetadata: &infopb.MetricMetadataInfo{}, - Exemplars: &infopb.ExemplarsInfo{}, - } - case component.Query: - { - return infopb.InfoResponse{ - Store: &infopb.StoreInfo{ - MinTime: mintime, - MaxTime: maxTime, - }, - Rules: &infopb.RulesInfo{}, - Targets: &infopb.TargetsInfo{}, - MetricMetadata: &infopb.MetricMetadataInfo{}, - Exemplars: &infopb.ExemplarsInfo{}, - Query: &infopb.QueryAPIInfo{}, - } - } - case component.Receive: - { - return infopb.InfoResponse{ - Store: &infopb.StoreInfo{ - MinTime: mintime, - MaxTime: maxTime, - }, - Exemplars: &infopb.ExemplarsInfo{}, - } - } - case component.Store: - return infopb.InfoResponse{ - Store: &infopb.StoreInfo{ - MinTime: mintime, - MaxTime: maxTime, - }, - } - case component.Rule: - return infopb.InfoResponse{ - Store: &infopb.StoreInfo{ - MinTime: mintime, - MaxTime: maxTime, - }, - Rules: &infopb.RulesInfo{}, - } - default: - return infopb.InfoResponse{} - } -} - // stringError forces the error to be a string // when marshaled into a JSON. type stringError struct { @@ -199,19 +117,21 @@ type EndpointStatus struct { // TODO(hitanshu-mehta) Currently,only collecting metrics of storeEndpoints. Make this struct generic. type endpointSetNodeCollector struct { mtx sync.Mutex - storeNodes map[component.Component]map[string]int + storeNodes map[string]map[string]int storePerExtLset map[string]int + logger log.Logger connectionsDesc *prometheus.Desc labels []string } -func newEndpointSetNodeCollector(labels ...string) *endpointSetNodeCollector { +func newEndpointSetNodeCollector(logger log.Logger, labels ...string) *endpointSetNodeCollector { if len(labels) == 0 { labels = []string{string(ExternalLabels), string(StoreType)} } return &endpointSetNodeCollector{ - storeNodes: map[component.Component]map[string]int{}, + logger: logger, + storeNodes: map[string]map[string]int{}, connectionsDesc: prometheus.NewDesc( "thanos_store_nodes_grpc_connections", "Number of gRPC connection to Store APIs. Opened connection means healthy store APIs available for Querier.", @@ -234,8 +154,8 @@ func truncateExtLabels(s string, threshold int) string { } return s } -func (c *endpointSetNodeCollector) Update(nodes map[component.Component]map[string]int) { - storeNodes := make(map[component.Component]map[string]int, len(nodes)) +func (c *endpointSetNodeCollector) Update(nodes map[string]map[string]int) { + storeNodes := make(map[string]map[string]int, len(nodes)) storePerExtLset := map[string]int{} for storeType, occurrencesPerExtLset := range nodes { @@ -261,12 +181,8 @@ func (c *endpointSetNodeCollector) Collect(ch chan<- prometheus.Metric) { c.mtx.Lock() defer c.mtx.Unlock() - for storeType, occurrencesPerExtLset := range c.storeNodes { + for k, occurrencesPerExtLset := range c.storeNodes { for externalLabels, occurrences := range occurrencesPerExtLset { - var storeTypeStr string - if storeType != nil { - storeTypeStr = storeType.String() - } // Select only required labels. lbls := []string{} for _, lbl := range c.labels { @@ -274,10 +190,15 @@ func (c *endpointSetNodeCollector) Collect(ch chan<- prometheus.Metric) { case string(ExternalLabels): lbls = append(lbls, externalLabels) case string(StoreType): - lbls = append(lbls, storeTypeStr) + lbls = append(lbls, k) } } - ch <- prometheus.MustNewConstMetric(c.connectionsDesc, prometheus.GaugeValue, float64(occurrences), lbls...) + select { + case ch <- prometheus.MustNewConstMetric(c.connectionsDesc, prometheus.GaugeValue, float64(occurrences), lbls...): + case <-time.After(1 * time.Second): + level.Warn(c.logger).Log("msg", "failed to collect endpointset metrics", "timeout", 1*time.Second) + return + } } } } @@ -319,7 +240,7 @@ func NewEndpointSet( endpointInfoTimeout time.Duration, endpointMetricLabels ...string, ) *EndpointSet { - endpointsMetric := newEndpointSetNodeCollector(endpointMetricLabels...) + endpointsMetric := newEndpointSetNodeCollector(logger, endpointMetricLabels...) if reg != nil { reg.MustRegister(endpointsMetric) } @@ -391,8 +312,7 @@ func (e *EndpointSet) Update(ctx context.Context) { defer wg.Done() ctx, cancel := context.WithTimeout(ctx, e.endpointInfoTimeout) defer cancel() - - newRef, err := e.newEndpointRef(ctx, spec) + newRef, err := e.newEndpointRef(spec) if err != nil { level.Warn(e.logger).Log("msg", "new endpoint creation failed", "err", err, "address", spec.Addr()) return @@ -448,12 +368,12 @@ func (e *EndpointSet) Update(ctx context.Context) { // All producers that expose StoreAPI should have unique external labels. Check all which connect to our Querier. if er.HasStoreAPI() && (er.ComponentType() == component.Sidecar || er.ComponentType() == component.Rule) && - stats[component.Sidecar][extLset]+stats[component.Rule][extLset] > 0 { + stats[component.Sidecar.String()][extLset]+stats[component.Rule.String()][extLset] > 0 { level.Warn(e.logger).Log("msg", "found duplicate storeEndpoints producer (sidecar or ruler). This is not advices as it will malform data in in the same bucket", - "address", addr, "extLset", extLset, "duplicates", fmt.Sprintf("%v", stats[component.Sidecar][extLset]+stats[component.Rule][extLset]+1)) + "address", addr, "extLset", extLset, "duplicates", fmt.Sprintf("%v", stats[component.Sidecar.String()][extLset]+stats[component.Rule.String()][extLset]+1)) } - stats[er.ComponentType()][extLset]++ + stats[er.ComponentType().String()][extLset]++ } e.endpointsMetric.Update(stats) @@ -525,6 +445,7 @@ func (e *EndpointSet) GetStoreClients() []store.Client { StoreClient: storepb.NewStoreClient(er.cc), addr: er.addr, metadata: er.metadata, + status: er.status, }) er.mtx.RUnlock() } @@ -649,17 +570,12 @@ type endpointRef struct { // newEndpointRef creates a new endpointRef with a gRPC channel to the given the IP address. // The call to newEndpointRef will return an error if establishing the channel fails. -func (e *EndpointSet) newEndpointRef(ctx context.Context, spec *GRPCEndpointSpec) (*endpointRef, error) { +func (e *EndpointSet) newEndpointRef(spec *GRPCEndpointSpec) (*endpointRef, error) { var dialOpts []grpc.DialOption dialOpts = append(dialOpts, e.dialOpts...) dialOpts = append(dialOpts, spec.dialOpts...) - // By default DialContext is non-blocking which means that any connection - // failure won't be reported/logged. Instead block until the connection is - // successfully established and return the details of the connection error - // if any. - dialOpts = append(dialOpts, grpc.WithReturnConnectionError()) - conn, err := grpc.DialContext(ctx, spec.Addr(), dialOpts...) + conn, err := grpc.NewClient(spec.Addr(), dialOpts...) if err != nil { return nil, errors.Wrap(err, "dialing connection") } @@ -715,7 +631,7 @@ func (er *endpointRef) updateMetadata(metadata *endpointMetadata, err error) { } // isQueryable returns true if an endpointRef should be used for querying. -// A strict endpointRef is always queriable. A non-strict endpointRef +// A strict endpointRef is always queryable. A non-strict endpointRef // is queryable if the last health check (info call) succeeded. func (er *endpointRef) isQueryable() bool { er.mtx.RLock() @@ -785,7 +701,7 @@ func (er *endpointRef) LabelSets() []labels.Labels { er.mtx.RLock() defer er.mtx.RUnlock() - return er.labelSets() + return er.status.LabelSets } func (er *endpointRef) labelSets() []labels.Labels { @@ -795,11 +711,7 @@ func (er *endpointRef) labelSets() []labels.Labels { labelSet := make([]labels.Labels, 0, len(er.metadata.LabelSets)) for _, ls := range labelpb.ZLabelSetsToPromLabelSets(er.metadata.LabelSets...) { - if len(ls) == 0 { - continue - } - // Compatibility label for Queriers pre 0.8.1. Filter it out now. - if ls[0].Name == store.CompatibilityTypeLabelName { + if ls.Len() == 0 { continue } labelSet = append(labelSet, ls.Copy()) @@ -870,7 +782,7 @@ func (er *endpointRef) Addr() (string, bool) { } func (er *endpointRef) Close() { - runutil.CloseWithLogOnErr(er.logger, er.cc, fmt.Sprintf("endpoint %v connection closed", er.addr)) + runutil.CloseWithLogOnErr(er.logger, er.cc, "endpoint %v connection closed", er.addr) } func (er *endpointRef) apisPresent() []string { @@ -903,14 +815,18 @@ func (er *endpointRef) apisPresent() []string { return apisPresent } +func (er *endpointRef) Matches(matchers []*labels.Matcher) bool { + return true +} + type endpointMetadata struct { *infopb.InfoResponse } -func newEndpointAPIStats() map[component.Component]map[string]int { - nodes := make(map[component.Component]map[string]int, len(storepb.StoreType_name)) - for i := range storepb.StoreType_name { - nodes[component.FromProto(storepb.StoreType(i))] = map[string]int{} +func newEndpointAPIStats() map[string]map[string]int { + nodes := make(map[string]map[string]int, len(component.All)) + for _, comp := range component.All { + nodes[comp.String()] = map[string]int{} } return nodes } diff --git a/pkg/query/endpointset_test.go b/pkg/query/endpointset_test.go index f9955d3412..83c5776d31 100644 --- a/pkg/query/endpointset_test.go +++ b/pkg/query/endpointset_test.go @@ -28,7 +28,6 @@ import ( "github.com/thanos-io/thanos/pkg/info/infopb" "github.com/thanos-io/thanos/pkg/store" "github.com/thanos-io/thanos/pkg/store/labelpb" - "github.com/thanos-io/thanos/pkg/store/storepb" ) var testGRPCOpts = []grpc.DialOption{ @@ -109,39 +108,6 @@ func (c *mockedEndpoint) Info(ctx context.Context, r *infopb.InfoRequest) (*info return &c.info, nil } -type mockedStoreSrv struct { - infoDelay time.Duration - info storepb.InfoResponse - err error -} - -func (s *mockedStoreSrv) setResponseError(err error) { - s.err = err -} - -func (s *mockedStoreSrv) Info(ctx context.Context, _ *storepb.InfoRequest) (*storepb.InfoResponse, error) { - if s.err != nil { - return nil, s.err - } - - select { - case <-ctx.Done(): - return nil, context.Canceled - case <-time.After(s.infoDelay): - } - - return &s.info, nil -} -func (s *mockedStoreSrv) Series(*storepb.SeriesRequest, storepb.Store_SeriesServer) error { - return nil -} -func (s *mockedStoreSrv) LabelNames(context.Context, *storepb.LabelNamesRequest) (*storepb.LabelNamesResponse, error) { - return nil, nil -} -func (s *mockedStoreSrv) LabelValues(context.Context, *storepb.LabelValuesRequest) (*storepb.LabelValuesResponse, error) { - return nil, nil -} - type APIs struct { store bool metricMetadata bool @@ -160,35 +126,14 @@ type testEndpointMeta struct { type testEndpoints struct { srvs map[string]*grpc.Server endpoints map[string]*mockedEndpoint - stores map[string]*mockedStoreSrv orderAddrs []string exposedAPIs map[string]*APIs } -func componentTypeToStoreType(componentType string) storepb.StoreType { - switch componentType { - case component.Query.String(): - return storepb.StoreType_QUERY - case component.Rule.String(): - return storepb.StoreType_RULE - case component.Sidecar.String(): - return storepb.StoreType_SIDECAR - case component.Store.String(): - return storepb.StoreType_STORE - case component.Receive.String(): - return storepb.StoreType_RECEIVE - case component.Debug.String(): - return storepb.StoreType_DEBUG - default: - return storepb.StoreType_STORE - } -} - func startTestEndpoints(testEndpointMeta []testEndpointMeta) (*testEndpoints, error) { e := &testEndpoints{ srvs: map[string]*grpc.Server{}, endpoints: map[string]*mockedEndpoint{}, - stores: map[string]*mockedStoreSrv{}, exposedAPIs: map[string]*APIs{}, } @@ -203,20 +148,6 @@ func startTestEndpoints(testEndpointMeta []testEndpointMeta) (*testEndpoints, er srv := grpc.NewServer() addr := listener.Addr().String() - storeSrv := &mockedStoreSrv{ - err: meta.err, - info: storepb.InfoResponse{ - LabelSets: meta.extlsetFn(listener.Addr().String()), - StoreType: componentTypeToStoreType(meta.ComponentType), - }, - infoDelay: meta.infoDelay, - } - - if meta.Store != nil { - storeSrv.info.MinTime = meta.Store.MinTime - storeSrv.info.MaxTime = meta.Store.MaxTime - } - endpointSrv := &mockedEndpoint{ err: meta.err, info: infopb.InfoResponse{ @@ -232,7 +163,6 @@ func startTestEndpoints(testEndpointMeta []testEndpointMeta) (*testEndpoints, er infoDelay: meta.infoDelay, } infopb.RegisterInfoServer(srv, endpointSrv) - storepb.RegisterStoreServer(srv, storeSrv) go func() { _ = srv.Serve(listener) }() @@ -240,7 +170,6 @@ func startTestEndpoints(testEndpointMeta []testEndpointMeta) (*testEndpoints, er e.exposedAPIs[addr] = exposedAPIs(meta.ComponentType) e.srvs[addr] = srv e.endpoints[addr] = endpointSrv - e.stores[addr] = storeSrv e.orderAddrs = append(e.orderAddrs, listener.Addr().String()) } @@ -271,6 +200,8 @@ func (e *testEndpoints) CloseOne(addr string) { } func TestTruncateExtLabels(t *testing.T) { + t.Parallel() + const testLength = 10 for _, tc := range []struct { @@ -311,6 +242,8 @@ func TestTruncateExtLabels(t *testing.T) { } func TestEndpointSetUpdate(t *testing.T) { + t.Parallel() + const metricsMeta = ` # HELP thanos_store_nodes_grpc_connections Number of gRPC connection to Store APIs. Opened connection means healthy store APIs available for Querier. # TYPE thanos_store_nodes_grpc_connections gauge @@ -444,6 +377,8 @@ func TestEndpointSetUpdate(t *testing.T) { } func TestEndpointSetUpdate_DuplicateSpecs(t *testing.T) { + t.Parallel() + endpoints, err := startTestEndpoints([]testEndpointMeta{ { InfoResponse: sidecarInfo, @@ -468,6 +403,8 @@ func TestEndpointSetUpdate_DuplicateSpecs(t *testing.T) { } func TestEndpointSetUpdate_EndpointGoingAway(t *testing.T) { + t.Parallel() + endpoints, err := startTestEndpoints([]testEndpointMeta{ { InfoResponse: sidecarInfo, @@ -497,6 +434,8 @@ func TestEndpointSetUpdate_EndpointGoingAway(t *testing.T) { } func TestEndpointSetUpdate_EndpointComingOnline(t *testing.T) { + t.Parallel() + endpoints, err := startTestEndpoints([]testEndpointMeta{ { err: fmt.Errorf("endpoint unavailable"), @@ -526,6 +465,8 @@ func TestEndpointSetUpdate_EndpointComingOnline(t *testing.T) { } func TestEndpointSetUpdate_StrictEndpointMetadata(t *testing.T) { + t.Parallel() + info := sidecarInfo info.Store.MinTime = 111 info.Store.MaxTime = 222 @@ -566,6 +507,8 @@ func TestEndpointSetUpdate_StrictEndpointMetadata(t *testing.T) { } func TestEndpointSetUpdate_PruneInactiveEndpoints(t *testing.T) { + t.Parallel() + testCases := []struct { name string endpoints []testEndpointMeta @@ -622,7 +565,6 @@ func TestEndpointSetUpdate_PruneInactiveEndpoints(t *testing.T) { addr := discoveredEndpointAddr[0] endpoints.endpoints[addr].setResponseError(errors.New("failed info request")) - endpoints.stores[addr].setResponseError(errors.New("failed info request")) endpointSet.Update(context.Background()) updateTime = updateTime.Add(10 * time.Minute) @@ -634,6 +576,8 @@ func TestEndpointSetUpdate_PruneInactiveEndpoints(t *testing.T) { } func TestEndpointSetUpdate_AtomicEndpointAdditions(t *testing.T) { + t.Parallel() + numResponses := 4 metas := makeInfoResponses(numResponses) metas[1].infoDelay = 2 * time.Second @@ -665,6 +609,8 @@ func TestEndpointSetUpdate_AtomicEndpointAdditions(t *testing.T) { } func TestEndpointSetUpdate_AvailabilityScenarios(t *testing.T) { + t.Parallel() + endpoints, err := startTestEndpoints([]testEndpointMeta{ { InfoResponse: sidecarInfo, @@ -764,7 +710,7 @@ func TestEndpointSetUpdate_AvailabilityScenarios(t *testing.T) { // Check stats. expected := newEndpointAPIStats() - expected[component.Sidecar] = map[string]int{ + expected[component.Sidecar.String()] = map[string]int{ fmt.Sprintf("{a=\"b\"},{addr=\"%s\"}", discoveredEndpointAddr[0]): 1, fmt.Sprintf("{a=\"b\"},{addr=\"%s\"}", discoveredEndpointAddr[1]): 1, } @@ -777,7 +723,7 @@ func TestEndpointSetUpdate_AvailabilityScenarios(t *testing.T) { testutil.Equals(t, 2, len(endpointSet.endpoints)) endpoints.CloseOne(discoveredEndpointAddr[0]) - delete(expected[component.Sidecar], fmt.Sprintf("{a=\"b\"},{addr=\"%s\"}", discoveredEndpointAddr[0])) + delete(expected[component.Sidecar.String()], fmt.Sprintf("{a=\"b\"},{addr=\"%s\"}", discoveredEndpointAddr[0])) // We expect Update to tear down store client for closed store server. endpointSet.Update(context.Background()) @@ -954,11 +900,6 @@ func TestEndpointSetUpdate_AvailabilityScenarios(t *testing.T) { {Name: "l3", Value: "v4"}, }, }, - { - Labels: []labelpb.ZLabel{ - {Name: store.CompatibilityTypeLabelName, Value: "store"}, - }, - }, } }, }, @@ -978,11 +919,6 @@ func TestEndpointSetUpdate_AvailabilityScenarios(t *testing.T) { {Name: "l3", Value: "v4"}, }, }, - { - Labels: []labelpb.ZLabel{ - {Name: store.CompatibilityTypeLabelName, Value: "store"}, - }, - }, } }, }, @@ -1035,22 +971,22 @@ func TestEndpointSetUpdate_AvailabilityScenarios(t *testing.T) { // Check stats. expected = newEndpointAPIStats() - expected[component.Query] = map[string]int{ + expected[component.Query.String()] = map[string]int{ "{l1=\"v2\", l2=\"v3\"}": 1, "{l1=\"v2\", l2=\"v3\"},{l3=\"v4\"}": 2, } - expected[component.Rule] = map[string]int{ + expected[component.Rule.String()] = map[string]int{ "{l1=\"v2\", l2=\"v3\"}": 2, } - expected[component.Sidecar] = map[string]int{ + expected[component.Sidecar.String()] = map[string]int{ fmt.Sprintf("{a=\"b\"},{addr=\"%s\"}", discoveredEndpointAddr[1]): 1, "{l1=\"v2\", l2=\"v3\"}": 2, } - expected[component.Store] = map[string]int{ + expected[component.Store.String()] = map[string]int{ "": 2, "{l1=\"v2\", l2=\"v3\"},{l3=\"v4\"}": 3, } - expected[component.Receive] = map[string]int{ + expected[component.Receive.String()] = map[string]int{ "{l1=\"v2\", l2=\"v3\"},{l3=\"v4\"}": 2, } testutil.Equals(t, expected, endpointSet.endpointsMetric.storeNodes) @@ -1069,6 +1005,8 @@ func TestEndpointSetUpdate_AvailabilityScenarios(t *testing.T) { } func TestEndpointSet_Update_NoneAvailable(t *testing.T) { + t.Parallel() + endpoints, err := startTestEndpoints([]testEndpointMeta{ { InfoResponse: sidecarInfo, @@ -1131,6 +1069,8 @@ func TestEndpointSet_Update_NoneAvailable(t *testing.T) { // TestEndpoint_Update_QuerierStrict tests what happens when the strict mode is enabled/disabled. func TestEndpoint_Update_QuerierStrict(t *testing.T) { + t.Parallel() + endpoints, err := startTestEndpoints([]testEndpointMeta{ { InfoResponse: &infopb.InfoResponse{ @@ -1270,6 +1210,8 @@ func TestEndpoint_Update_QuerierStrict(t *testing.T) { } func TestEndpointSet_APIs_Discovery(t *testing.T) { + t.Parallel() + endpoints, err := startTestEndpoints([]testEndpointMeta{ { InfoResponse: sidecarInfo, @@ -1441,40 +1383,40 @@ func TestEndpointSet_APIs_Discovery(t *testing.T) { t, tc.states[currentState].expectedStores, gotStores, - "unexepected discovered storeAPIs in state %q", + "unexpected discovered storeAPIs in state %q", tc.states[currentState].name) testutil.Equals( t, tc.states[currentState].expectedRules, gotRules, - "unexepected discovered rulesAPIs in state %q", + "unexpected discovered rulesAPIs in state %q", tc.states[currentState].name) testutil.Equals( t, tc.states[currentState].expectedTarget, gotTarget, - "unexepected discovered targetAPIs in state %q", + "unexpected discovered targetAPIs in state %q", tc.states[currentState].name, ) testutil.Equals( t, tc.states[currentState].expectedMetricMetadata, gotMetricMetadata, - "unexepected discovered metricMetadataAPIs in state %q", + "unexpected discovered metricMetadataAPIs in state %q", tc.states[currentState].name, ) testutil.Equals( t, tc.states[currentState].expectedExemplars, gotExemplars, - "unexepected discovered ExemplarsAPIs in state %q", + "unexpected discovered ExemplarsAPIs in state %q", tc.states[currentState].name, ) testutil.Equals( t, tc.states[currentState].expectedQueryAPIs, gotQueryAPIs, - "unexepected discovered QueryAPIs in state %q", + "unexpected discovered QueryAPIs in state %q", tc.states[currentState].name, ) @@ -1519,6 +1461,8 @@ func (e *errThatMarshalsToEmptyDict) Error() string { // Test highlights that without wrapping the error, it is marshaled to empty dict {}, not its message. func TestEndpointStringError(t *testing.T) { + t.Parallel() + dictErr := &errThatMarshalsToEmptyDict{msg: "Error message"} stringErr := &stringError{originalErr: dictErr} @@ -1534,6 +1478,8 @@ func TestEndpointStringError(t *testing.T) { // Errors that usually marshal to empty dict should return the original error string. func TestUpdateEndpointStateLastError(t *testing.T) { + t.Parallel() + tcs := []struct { InputError error ExpectedLastErr string @@ -1560,6 +1506,8 @@ func TestUpdateEndpointStateLastError(t *testing.T) { } func TestUpdateEndpointStateForgetsPreviousErrors(t *testing.T) { + t.Parallel() + mockEndpointRef := &endpointRef{ addr: "mockedStore", metadata: &endpointMetadata{ diff --git a/pkg/query/internal/test-storeset-pre-v0.8.0/storeset_test.go b/pkg/query/internal/test-storeset-pre-v0.8.0/storeset_test.go deleted file mode 100644 index 13c0912fcc..0000000000 --- a/pkg/query/internal/test-storeset-pre-v0.8.0/storeset_test.go +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright (c) The Thanos Authors. -// Licensed under the Apache License 2.0. - -package testoldstoreset - -import ( - "context" - "fmt" - "math" - "net" - "os" - "sort" - "testing" - "time" - - "github.com/go-kit/log" - "github.com/go-kit/log/level" - "github.com/prometheus/prometheus/model/labels" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/status" - - "github.com/efficientgo/core/testutil" - "github.com/thanos-io/thanos/pkg/component" - "github.com/thanos-io/thanos/pkg/store" - "github.com/thanos-io/thanos/pkg/store/labelpb" - "github.com/thanos-io/thanos/pkg/store/storepb" - "github.com/thanos-io/thanos/pkg/testutil/custom" -) - -var testGRPCOpts = []grpc.DialOption{ - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt32)), - grpc.WithTransportCredentials(insecure.NewCredentials()), -} - -type testStore struct { - info storepb.InfoResponse -} - -func (s *testStore) Info(ctx context.Context, r *storepb.InfoRequest) (*storepb.InfoResponse, error) { - return &s.info, nil -} - -func (s *testStore) Series(r *storepb.SeriesRequest, srv storepb.Store_SeriesServer) error { - return status.Error(codes.Unimplemented, "not implemented") -} - -func (s *testStore) LabelNames(ctx context.Context, r *storepb.LabelNamesRequest) ( - *storepb.LabelNamesResponse, error, -) { - return nil, status.Error(codes.Unimplemented, "not implemented") -} - -func (s *testStore) LabelValues(ctx context.Context, r *storepb.LabelValuesRequest) ( - *storepb.LabelValuesResponse, error, -) { - return nil, status.Error(codes.Unimplemented, "not implemented") -} - -type testStoreMeta struct { - extlsetFn func(addr string) []labelpb.ZLabelSet - storeType component.StoreAPI -} - -type testStores struct { - srvs map[string]*grpc.Server -} - -func startTestStores(stores []testStoreMeta) (*testStores, error) { - st := &testStores{ - srvs: map[string]*grpc.Server{}, - } - - for _, store := range stores { - listener, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - // Close so far started servers. - st.Close() - return nil, err - } - - srv := grpc.NewServer() - storepb.RegisterStoreServer(srv, &testStore{info: storepb.InfoResponse{LabelSets: store.extlsetFn(listener.Addr().String()), StoreType: store.storeType.ToProto()}}) - go func() { - _ = srv.Serve(listener) - }() - - st.srvs[listener.Addr().String()] = srv - } - - return st, nil -} - -func (s *testStores) StoreAddresses() []string { - var stores []string - for addr := range s.srvs { - stores = append(stores, addr) - } - return stores -} - -func (s *testStores) Close() { - for _, srv := range s.srvs { - srv.Stop() - } - s.srvs = nil -} - -func (s *testStores) CloseOne(addr string) { - srv, ok := s.srvs[addr] - if !ok { - return - } - - srv.Stop() - delete(s.srvs, addr) -} - -func specsFromAddrFunc(addrs []string) func() []StoreSpec { - return func() (specs []StoreSpec) { - for _, addr := range addrs { - specs = append(specs, NewGRPCStoreSpec(addr)) - } - return specs - } -} - -func TestMain(m *testing.M) { - custom.TolerantVerifyLeakMain(m) -} - -func TestPre0_8_0_StoreSet_AgainstNewStoreGW(t *testing.T) { - st, err := startTestStores([]testStoreMeta{ - { - storeType: component.Sidecar, - extlsetFn: func(addr string) []labelpb.ZLabelSet { - return []labelpb.ZLabelSet{ - { - Labels: []labelpb.ZLabel{ - {Name: "l1", Value: "v2"}, - {Name: "l2", Value: "v3"}, - }, - }, - } - }, - }, - { - storeType: component.Store, - extlsetFn: func(addr string) []labelpb.ZLabelSet { - return []labelpb.ZLabelSet{ - { - Labels: []labelpb.ZLabel{ - // This is the labelset exposed by store when having only one sidecar's data. - {Name: "l1", Value: "v2"}, - {Name: "l2", Value: "v3"}, - }, - }, - { - Labels: []labelpb.ZLabel{{Name: store.CompatibilityTypeLabelName, Value: "store"}}, - }, - } - }, - }, - // We expect this to be duplicated. - { - storeType: component.Store, - extlsetFn: func(addr string) []labelpb.ZLabelSet { - return []labelpb.ZLabelSet{ - { - Labels: []labelpb.ZLabel{ - {Name: "l1", Value: "v2"}, - {Name: "l2", Value: "v3"}, - }, - }, - { - Labels: []labelpb.ZLabel{{Name: store.CompatibilityTypeLabelName, Value: "store"}}, - }, - } - }, - }, - }) - testutil.Ok(t, err) - defer st.Close() - - logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)) - logger = level.NewFilter(logger, level.AllowDebug()) - logger = log.With(logger, "ts", log.DefaultTimestampUTC, "caller", log.DefaultCaller) - storeSet := NewStoreSet(logger, nil, specsFromAddrFunc(st.StoreAddresses()), testGRPCOpts, time.Minute) - storeSet.gRPCInfoCallTimeout = 2 * time.Second - defer storeSet.Close() - - // Should not matter how many of these we run. - storeSet.Update(context.Background()) - storeSet.Update(context.Background()) - storeSet.Update(context.Background()) - storeSet.Update(context.Background()) - - testutil.Assert(t, len(storeSet.stores) == 2, fmt.Sprintf("all services should respond just fine, but we expect duplicates being blocked. Expected %d stores, got %d", 5, len(storeSet.stores))) - - // Sort result to be able to compare. - var existingStoreLabels [][]labels.Labels - for _, store := range storeSet.stores { - lset := append([]labels.Labels{}, store.LabelSets()...) - existingStoreLabels = append(existingStoreLabels, lset) - } - sort.Slice(existingStoreLabels, func(i, j int) bool { - return len(existingStoreLabels[i]) > len(existingStoreLabels[j]) - }) - - testutil.Equals(t, [][]labels.Labels{ - { - { - {Name: "l1", Value: "v2"}, - {Name: "l2", Value: "v3"}, - }, - { - {Name: store.CompatibilityTypeLabelName, Value: "store"}, - }, - }, - { - { - {Name: "l1", Value: "v2"}, - {Name: "l2", Value: "v3"}, - }, - }, - }, existingStoreLabels) -} diff --git a/pkg/query/querier.go b/pkg/query/querier.go index 9a1a311097..e084344ed9 100644 --- a/pkg/query/querier.go +++ b/pkg/query/querier.go @@ -331,6 +331,7 @@ func (q *querier) selectFn(ctx context.Context, hints *storage.SelectHints, ms . req := storepb.SeriesRequest{ MinTime: hints.Start, MaxTime: hints.End, + Limit: int64(hints.Limit), Matchers: sms, MaxResolutionWindow: q.maxResolutionMillis, Aggregates: aggrs, @@ -373,7 +374,7 @@ func (q *querier) selectFn(ctx context.Context, hints *storage.SelectHints, ms . } // LabelValues returns all potential values for a label name. -func (q *querier) LabelValues(ctx context.Context, name string, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) { +func (q *querier) LabelValues(ctx context.Context, name string, hints *storage.LabelHints, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) { span, ctx := tracing.StartSpan(ctx, "querier_label_values") defer span.Finish() @@ -384,12 +385,18 @@ func (q *querier) LabelValues(ctx context.Context, name string, matchers ...*lab if err != nil { return nil, nil, errors.Wrap(err, "converting prom matchers to storepb matchers") } + + if hints == nil { + hints = &storage.LabelHints{} + } + req := &storepb.LabelValuesRequest{ Label: name, PartialResponseStrategy: q.partialResponseStrategy, Start: q.mint, End: q.maxt, Matchers: pbMatchers, + Limit: int64(hints.Limit), } if q.isDedupEnabled() { @@ -411,7 +418,7 @@ func (q *querier) LabelValues(ctx context.Context, name string, matchers ...*lab // LabelNames returns all the unique label names present in the block in sorted order constrained // by the given matchers. -func (q *querier) LabelNames(ctx context.Context, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) { +func (q *querier) LabelNames(ctx context.Context, hints *storage.LabelHints, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) { span, ctx := tracing.StartSpan(ctx, "querier_label_names") defer span.Finish() @@ -423,11 +430,16 @@ func (q *querier) LabelNames(ctx context.Context, matchers ...*labels.Matcher) ( return nil, nil, errors.Wrap(err, "converting prom matchers to storepb matchers") } + if hints == nil { + hints = &storage.LabelHints{} + } + req := &storepb.LabelNamesRequest{ PartialResponseStrategy: q.partialResponseStrategy, Start: q.mint, End: q.maxt, Matchers: pbMatchers, + Limit: int64(hints.Limit), } if q.isDedupEnabled() { diff --git a/pkg/query/querier_test.go b/pkg/query/querier_test.go index 92340d57db..794b2e6d63 100644 --- a/pkg/query/querier_test.go +++ b/pkg/query/querier_test.go @@ -44,6 +44,8 @@ type sample struct { } func TestQueryableCreator_MaxResolution(t *testing.T) { + t.Parallel() + testProxy := &testStoreServer{resps: []*storepb.SeriesResponse{}} queryableCreator := NewQueryableCreator(nil, nil, newProxyStore(testProxy), 2, 5*time.Second) @@ -72,6 +74,8 @@ func TestQueryableCreator_MaxResolution(t *testing.T) { // Tests E2E how PromQL works with downsampled data. func TestQuerier_DownsampledData(t *testing.T) { + t.Parallel() + testProxy := &testStoreServer{ resps: []*storepb.SeriesResponse{ storeSeriesResponse(t, labels.FromStrings("__name__", "a", "zzz", "a", "aaa", "bbb"), []sample{{99, 1}, {199, 5}}), // Downsampled chunk from Store. @@ -335,6 +339,8 @@ func (s series) Iterator() chunkenc.Iterator { // // This is because when promql displays data for a given range it looks back 5min before the requested time window. func TestQuerier_Select_AfterPromQL(t *testing.T) { + t.Parallel() + logger := log.NewLogfmtLogger(os.Stderr) for _, tcase := range []struct { @@ -388,7 +394,7 @@ func TestQuerier_Select_AfterPromQL(t *testing.T) { resolution := time.Duration(tcase.hints.Step) * time.Millisecond t.Run(fmt.Sprintf("dedup=%v, resolution=%v", sc.dedup, resolution.String()), func(t *testing.T) { var actual []series - // Boostrap a local store and pass the data through promql. + // Bootstrap a local store and pass the data through promql. { g := gate.New(2) mq := &mockedQueryable{ @@ -423,6 +429,8 @@ func TestQuerier_Select_AfterPromQL(t *testing.T) { } func TestQuerier_Select(t *testing.T) { + t.Parallel() + logger := log.NewLogfmtLogger(os.Stderr) for _, tcase := range []struct { @@ -1056,6 +1064,8 @@ func (s *mockedSeriesIterator) Next() chunkenc.ValueType { func (s *mockedSeriesIterator) Err() error { return nil } func TestQuerierWithDedupUnderstoodByPromQL_Rate(t *testing.T) { + t.Parallel() + logger := log.NewLogfmtLogger(os.Stderr) s, err := store.NewLocalStoreFromJSONMmappableFile(logger, component.Debug, nil, "./testdata/issue2401-seriesresponses.json", store.ScanGRPCCurlProtoStreamMessages) @@ -1096,7 +1106,7 @@ func TestQuerierWithDedupUnderstoodByPromQL_Rate(t *testing.T) { vec, err := r.Matrix() testutil.Ok(t, err) testutil.Equals(t, promql.Matrix{ - {Metric: expectedLset1, Floats: []promql.FPoint{ + {DropName: true, Metric: expectedLset1, Floats: []promql.FPoint{ {T: 1587690300000, F: 13.652631578947368}, {T: 1587690400000, F: 14.049122807017543}, {T: 1587690500000, F: 13.961403508771928}, {T: 1587690600000, F: 13.617543859649121}, {T: 1587690700000, F: 14.568421052631578}, {T: 1587690800000, F: 14.989473684210525}, {T: 1587690900000, F: 16.2}, {T: 1587691000000, F: 16.052631578947366}, {T: 1587691100000, F: 15.831578947368419}, {T: 1587691200000, F: 15.659649122807016}, {T: 1587691300000, F: 14.842105263157894}, {T: 1587691400000, F: 14.003508771929823}, {T: 1587691500000, F: 13.782456140350876}, {T: 1587691600000, F: 13.86315789473684}, {T: 1587691700000, F: 15.270282598474376}, {T: 1587691800000, F: 14.343859649122805}, {T: 1587691900000, F: 13.975438596491227}, {T: 1587692000000, F: 13.399999999999999}, @@ -1104,7 +1114,7 @@ func TestQuerierWithDedupUnderstoodByPromQL_Rate(t *testing.T) { {T: 1587692700000, F: 8.19298245614035}, {T: 1587692800000, F: 11.91870302641626}, {T: 1587692900000, F: 13.75813610765101}, {T: 1587693000000, F: 13.087719298245613}, {T: 1587693100000, F: 13.466666666666665}, {T: 1587693200000, F: 14.028070175438595}, {T: 1587693300000, F: 14.23859649122807}, {T: 1587693400000, F: 15.407017543859647}, {T: 1587693500000, F: 15.915789473684208}, {T: 1587693600000, F: 15.712280701754384}, }}, - {Metric: expectedLset2, Floats: []promql.FPoint{ + {DropName: true, Metric: expectedLset2, Floats: []promql.FPoint{ {T: 1587690300000, F: 13.691228070175438}, {T: 1587690400000, F: 14.098245614035086}, {T: 1587690500000, F: 13.905263157894735}, {T: 1587690600000, F: 13.617543859649121}, {T: 1587690700000, F: 14.350877192982455}, {T: 1587690800000, F: 15.003508771929823}, {T: 1587690900000, F: 16.12280701754386}, {T: 1587691000000, F: 16.049122807017543}, {T: 1587691100000, F: 15.922807017543859}, {T: 1587691200000, F: 15.63157894736842}, {T: 1587691300000, F: 14.982456140350875}, {T: 1587691400000, F: 14.187259188557553}, {T: 1587691500000, F: 13.828070175438596}, {T: 1587691600000, F: 13.971929824561402}, {T: 1587691700000, F: 15.31994329585807}, {T: 1587691800000, F: 14.30877192982456}, {T: 1587691900000, F: 13.915789473684208}, {T: 1587692000000, F: 13.312280701754384}, @@ -1125,10 +1135,10 @@ func TestQuerierWithDedupUnderstoodByPromQL_Rate(t *testing.T) { vec, err := r.Matrix() testutil.Ok(t, err) testutil.Equals(t, promql.Matrix{ - {Metric: expectedLset1, Floats: []promql.FPoint{ + {DropName: true, Metric: expectedLset1, Floats: []promql.FPoint{ {T: 1587691800000, F: 14.457142857142856}, {T: 1587692300000, F: 14.761904761904761}, {T: 1587692800000, F: 13.127170868347338}, {T: 1587693300000, F: 12.93501400560224}, }}, - {Metric: expectedLset2, Floats: []promql.FPoint{ + {DropName: true, Metric: expectedLset2, Floats: []promql.FPoint{ {T: 1587691800000, F: 14.464425770308122}, {T: 1587692300000, F: 14.763025210084033}, {T: 1587692800000, F: 13.148909112808576}, {T: 1587693300000, F: 12.92829131652661}, }}, }, vec) @@ -1166,7 +1176,7 @@ func TestQuerierWithDedupUnderstoodByPromQL_Rate(t *testing.T) { vec, err := r.Matrix() testutil.Ok(t, err) testutil.Equals(t, promql.Matrix{ - {Metric: expectedLset, Floats: []promql.FPoint{ + {DropName: true, Metric: expectedLset, Floats: []promql.FPoint{ {T: 1587690300000, F: 13.691228070175438}, {T: 1587690400000, F: 14.098245614035086}, {T: 1587690500000, F: 13.905263157894735}, {T: 1587690600000, F: 13.617543859649121}, {T: 1587690700000, F: 14.350877192982455}, {T: 1587690800000, F: 15.003508771929823}, {T: 1587690900000, F: 16.12280701754386}, {T: 1587691000000, F: 16.049122807017543}, {T: 1587691100000, F: 15.922807017543859}, {T: 1587691200000, F: 15.63157894736842}, {T: 1587691300000, F: 14.982456140350875}, {T: 1587691400000, F: 14.187259188557553}, @@ -1190,7 +1200,7 @@ func TestQuerierWithDedupUnderstoodByPromQL_Rate(t *testing.T) { vec, err := r.Matrix() testutil.Ok(t, err) testutil.Equals(t, promql.Matrix{ - {Metric: expectedLset, Floats: []promql.FPoint{ + {DropName: true, Metric: expectedLset, Floats: []promql.FPoint{ {T: 1587691800000, F: 14.464425770308122}, {T: 1587692300000, F: 14.763025210084033}, {T: 1587692800000, F: 13.143575607888273}, diff --git a/pkg/query/query_bench_test.go b/pkg/query/query_bench_test.go index 44e4373a26..bd3368a754 100644 --- a/pkg/query/query_bench_test.go +++ b/pkg/query/query_bench_test.go @@ -28,6 +28,8 @@ import ( // this many times and within different interval e.g // TODO(bwplotka): Add benchmarks with PromQL involvement. func TestQuerySelect(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) storetestutil.RunSeriesInterestingCases(tb, 200e3, 200e3, func(t testutil.TB, samplesPerSeries, series int) { benchQuerySelect(t, samplesPerSeries, series, true) diff --git a/pkg/query/query_test.go b/pkg/query/query_test.go index b490156e82..8d1df8593c 100644 --- a/pkg/query/query_test.go +++ b/pkg/query/query_test.go @@ -4,7 +4,6 @@ package query import ( - "context" "fmt" "os" "path/filepath" @@ -121,21 +120,6 @@ func selectedStore(wrapped storepb.StoreServer, matchers []storepb.LabelMatcher, } } -func (s *selectStore) Info(ctx context.Context, r *storepb.InfoRequest) (*storepb.InfoResponse, error) { - resp, err := s.StoreServer.Info(ctx, r) - if err != nil { - return nil, err - } - if resp.MinTime < s.mint { - resp.MinTime = s.mint - } - if resp.MaxTime > s.maxt { - resp.MaxTime = s.maxt - } - // TODO(bwplotka): Match labelsets and expose only those? - return resp, nil -} - func (s *selectStore) Series(r *storepb.SeriesRequest, srv storepb.Store_SeriesServer) error { if r.MinTime < s.mint { r.MinTime = s.mint diff --git a/pkg/query/remote_engine.go b/pkg/query/remote_engine.go index 2b0e67e056..77a74c9a6f 100644 --- a/pkg/query/remote_engine.go +++ b/pkg/query/remote_engine.go @@ -22,16 +22,20 @@ import ( "github.com/thanos-io/promql-engine/api" + "github.com/opentracing/opentracing-go" "github.com/thanos-io/thanos/pkg/api/query/querypb" "github.com/thanos-io/thanos/pkg/info/infopb" + "github.com/thanos-io/thanos/pkg/server/http/middleware" "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb/prompb" + grpc_tracing "github.com/thanos-io/thanos/pkg/tracing/tracing_middleware" ) // Opts are the options for a PromQL query. type Opts struct { AutoDownsample bool ReplicaLabels []string + PartitionLabels []string Timeout time.Duration EnablePartialResponse bool } @@ -115,19 +119,17 @@ func (r *remoteEngine) MinT() int64 { hashBuf = make([]byte, 0, 128) highestMintByLabelSet = make(map[uint64]int64) ) - for _, lset := range r.infosWithoutReplicaLabels() { + for _, lset := range r.adjustedInfos() { key, _ := labelpb.ZLabelsToPromLabels(lset.Labels.Labels).HashWithoutLabels(hashBuf) lsetMinT, ok := highestMintByLabelSet[key] if !ok { highestMintByLabelSet[key] = lset.MinTime continue } - if lset.MinTime > lsetMinT { highestMintByLabelSet[key] = lset.MinTime } } - var mint int64 = math.MaxInt64 for _, m := range highestMintByLabelSet { if m < mint { @@ -149,16 +151,22 @@ func (r *remoteEngine) MaxT() int64 { func (r *remoteEngine) LabelSets() []labels.Labels { r.labelSetsOnce.Do(func() { - r.labelSets = r.infosWithoutReplicaLabels().LabelSets() + r.labelSets = r.adjustedInfos().LabelSets() }) return r.labelSets } -func (r *remoteEngine) infosWithoutReplicaLabels() infopb.TSDBInfos { +// adjustedInfos strips out replica labels and scopes the remaining labels +// onto the partition labels if they are set. +func (r *remoteEngine) adjustedInfos() infopb.TSDBInfos { replicaLabelSet := make(map[string]struct{}) for _, lbl := range r.opts.ReplicaLabels { replicaLabelSet[lbl] = struct{}{} } + partitionLabelsSet := make(map[string]struct{}) + for _, lbl := range r.opts.PartitionLabels { + partitionLabelsSet[lbl] = struct{}{} + } // Strip replica labels from the result. infos := make(infopb.TSDBInfos, 0, len(r.client.tsdbInfos)) @@ -169,6 +177,9 @@ func (r *remoteEngine) infosWithoutReplicaLabels() infopb.TSDBInfos { if _, ok := replicaLabelSet[lbl.Name]; ok { continue } + if _, ok := partitionLabelsSet[lbl.Name]; !ok && len(partitionLabelsSet) > 0 { + continue + } builder.Add(lbl.Name, lbl.Value) } infos = append(infos, infopb.NewTSDBInfo( @@ -177,7 +188,6 @@ func (r *remoteEngine) infosWithoutReplicaLabels() infopb.TSDBInfos { labelpb.ZLabelsFromPromLabels(builder.Labels())), ) } - return infos } @@ -187,10 +197,11 @@ func (r *remoteEngine) NewRangeQuery(_ context.Context, _ promql.QueryOpts, plan client: r.client, opts: r.opts, - plan: plan, - start: start, - end: end, - interval: interval, + plan: plan, + start: start, + end: end, + interval: interval, + remoteAddr: r.client.GetAddress(), }, nil } @@ -200,10 +211,11 @@ func (r *remoteEngine) NewInstantQuery(_ context.Context, _ promql.QueryOpts, pl client: r.client, opts: r.opts, - plan: plan, - start: ts, - end: ts, - interval: 0, + plan: plan, + start: ts, + end: ts, + interval: 0, + remoteAddr: r.client.GetAddress(), }, nil } @@ -212,21 +224,51 @@ type remoteQuery struct { client Client opts Opts - plan api.RemoteQuery - start time.Time - end time.Time - interval time.Duration + plan api.RemoteQuery + start time.Time + end time.Time + interval time.Duration + remoteAddr string + + samplesStats *stats.QuerySamples cancel context.CancelFunc } func (r *remoteQuery) Exec(ctx context.Context) *promql.Result { start := time.Now() + defer func() { + keys := []any{ + "msg", "Executed remote query", + "query", r.plan.String(), + "time", time.Since(start), + } + if r.samplesStats != nil { + keys = append(keys, "remote_peak_samples", r.samplesStats.PeakSamples) + keys = append(keys, "remote_total_samples", r.samplesStats.TotalSamples) + } + level.Debug(r.logger).Log(keys...) + }() qctx, cancel := context.WithCancel(ctx) r.cancel = cancel defer cancel() + var ( + queryRange = r.end.Sub(r.start) + requestID, _ = middleware.RequestIDFromContext(qctx) + ) + qctx = grpc_tracing.ClientAddContextTags(qctx, opentracing.Tags{ + "query.expr": r.plan.String(), + "query.remote_address": r.remoteAddr, + "query.start": r.start.UTC().String(), + "query.end": r.end.UTC().String(), + "query.interval_seconds": r.interval.Seconds(), + "query.range_seconds": queryRange.Seconds(), + "query.range_human": queryRange, + "request_id": requestID, + }) + var maxResolution int64 if r.opts.AutoDownsample { maxResolution = int64(r.interval.Seconds() / 5) @@ -236,6 +278,8 @@ func (r *remoteQuery) Exec(ctx context.Context) *promql.Result { level.Warn(r.logger).Log("msg", "Failed to encode query plan", "err", err) } + r.samplesStats = stats.NewQuerySamples(false) + // Instant query. if r.start == r.end { request := &querypb.QueryRequest{ @@ -259,6 +303,7 @@ func (r *remoteQuery) Exec(ctx context.Context) *promql.Result { result = make(promql.Vector, 0) warnings annotations.Annotations builder = labels.NewScratchBuilder(8) + qryStats querypb.QueryStats ) for { msg, err := qry.Recv() @@ -273,8 +318,15 @@ func (r *remoteQuery) Exec(ctx context.Context) *promql.Result { warnings.Add(errors.New(warn)) continue } + if s := msg.GetStats(); s != nil { + qryStats = *s + continue + } ts := msg.GetTimeseries() + if ts == nil { + continue + } builder.Reset() for _, l := range ts.Labels { builder.Add(strings.Clone(l.Name), strings.Clone(l.Value)) @@ -288,6 +340,8 @@ func (r *remoteQuery) Exec(ctx context.Context) *promql.Result { result = append(result, promql.Sample{Metric: builder.Labels(), F: ts.Samples[0].Value, T: r.start.UnixMilli()}) } } + r.samplesStats.UpdatePeak(int(qryStats.PeakSamples)) + r.samplesStats.TotalSamples = qryStats.SamplesTotal return &promql.Result{ Value: result, @@ -318,6 +372,7 @@ func (r *remoteQuery) Exec(ctx context.Context) *promql.Result { result = make(promql.Matrix, 0) warnings annotations.Annotations builder = labels.NewScratchBuilder(8) + qryStats querypb.QueryStats ) for { msg, err := qry.Recv() @@ -332,6 +387,10 @@ func (r *remoteQuery) Exec(ctx context.Context) *promql.Result { warnings.Add(errors.New(warn)) continue } + if s := msg.GetStats(); s != nil { + qryStats = *s + continue + } ts := msg.GetTimeseries() if ts == nil { @@ -360,7 +419,8 @@ func (r *remoteQuery) Exec(ctx context.Context) *promql.Result { } result = append(result, series) } - level.Debug(r.logger).Log("msg", "Executed query", "query", r.plan.String(), "time", time.Since(start)) + r.samplesStats.UpdatePeak(int(qryStats.PeakSamples)) + r.samplesStats.TotalSamples = qryStats.SamplesTotal return &promql.Result{Value: result, Warnings: warnings} } @@ -369,7 +429,11 @@ func (r *remoteQuery) Close() { r.Cancel() } func (r *remoteQuery) Statement() parser.Statement { return nil } -func (r *remoteQuery) Stats() *stats.Statistics { return nil } +func (r *remoteQuery) Stats() *stats.Statistics { + return &stats.Statistics{ + Samples: r.samplesStats, + } +} func (r *remoteQuery) Cancel() { if r.cancel != nil { diff --git a/pkg/query/remote_engine_test.go b/pkg/query/remote_engine_test.go index bca79598e5..2831855bd3 100644 --- a/pkg/query/remote_engine_test.go +++ b/pkg/query/remote_engine_test.go @@ -14,17 +14,19 @@ import ( "github.com/go-kit/log" "github.com/pkg/errors" "github.com/prometheus/prometheus/model/labels" - "github.com/prometheus/prometheus/promql/parser" "github.com/thanos-io/promql-engine/logicalplan" "github.com/thanos-io/promql-engine/query" "google.golang.org/grpc" "github.com/thanos-io/thanos/pkg/api/query/querypb" + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/info/infopb" "github.com/thanos-io/thanos/pkg/store/labelpb" ) func TestRemoteEngine_Warnings(t *testing.T) { + t.Parallel() + client := NewClient(&warnClient{}, "", nil) engine := NewRemoteEngine(log.NewNopLogger(), client, Opts{ Timeout: 1 * time.Second, @@ -34,7 +36,7 @@ func TestRemoteEngine_Warnings(t *testing.T) { end = time.Unix(120, 0) step = 30 * time.Second ) - qryExpr, err := parser.ParseExpr("up") + qryExpr, err := extpromql.ParseExpr("up") testutil.Ok(t, err) plan := logicalplan.NewFromAST(qryExpr, &query.Options{ @@ -61,11 +63,14 @@ func TestRemoteEngine_Warnings(t *testing.T) { } func TestRemoteEngine_LabelSets(t *testing.T) { + t.Parallel() + tests := []struct { - name string - tsdbInfos []infopb.TSDBInfo - replicaLabels []string - expected []labels.Labels + name string + tsdbInfos []infopb.TSDBInfo + replicaLabels []string + expected []labels.Labels + partitionLabels []string }{ { name: "empty label sets", @@ -103,13 +108,24 @@ func TestRemoteEngine_LabelSets(t *testing.T) { replicaLabels: []string{"a", "b"}, expected: []labels.Labels{labels.FromStrings("c", "2")}, }, + { + name: "non-empty label sets with partition labels", + tsdbInfos: []infopb.TSDBInfo{ + { + Labels: zLabelSetFromStrings("a", "1", "c", "2"), + }, + }, + partitionLabels: []string{"a"}, + expected: []labels.Labels{labels.FromStrings("a", "1")}, + }, } for _, testCase := range tests { t.Run(testCase.name, func(t *testing.T) { client := NewClient(nil, "", testCase.tsdbInfos) engine := NewRemoteEngine(log.NewNopLogger(), client, Opts{ - ReplicaLabels: testCase.replicaLabels, + ReplicaLabels: testCase.replicaLabels, + PartitionLabels: testCase.partitionLabels, }) testutil.Equals(t, testCase.expected, engine.LabelSets()) @@ -118,6 +134,8 @@ func TestRemoteEngine_LabelSets(t *testing.T) { } func TestRemoteEngine_MinT(t *testing.T) { + t.Parallel() + tests := []struct { name string tsdbInfos []infopb.TSDBInfo diff --git a/pkg/query/test_test.go b/pkg/query/test_test.go index b8457870ca..d8af78c66d 100644 --- a/pkg/query/test_test.go +++ b/pkg/query/test_test.go @@ -24,6 +24,8 @@ import ( "github.com/prometheus/prometheus/promql/parser/posrange" "github.com/prometheus/prometheus/storage" "github.com/prometheus/prometheus/util/teststorage" + + "github.com/thanos-io/thanos/pkg/extpromql" ) var ( @@ -261,7 +263,7 @@ func ParseStore(lines []string, i int) (int, *storeCmd, error) { } parts := patStore.FindStringSubmatch(lines[i]) - m, err := parser.ParseMetricSelector(parts[1]) + m, err := extpromql.ParseMetricSelector(parts[1]) if err != nil { return i, nil, raise(i, "invalid matcher definition %q: %s", parts[1], err) } @@ -322,7 +324,7 @@ func ParseEval(lines []string, i int) (int, *evalCmd, error) { at = parts[2] expr = parts[3] ) - _, err := parser.ParseExpr(expr) + _, err := extpromql.ParseExpr(expr) if err != nil { if perr, ok := err.(*parser.ParseErr); ok { perr.LineOffset = i diff --git a/pkg/query/testdata/promql/prometheus/functions.test b/pkg/query/testdata/promql/prometheus/functions.test index 76ed305f88..6a3d274513 100644 --- a/pkg/query/testdata/promql/prometheus/functions.test +++ b/pkg/query/testdata/promql/prometheus/functions.test @@ -745,10 +745,10 @@ clear eval instant at 50m absent(sum(nonexistent{job="testjob", instance="testinstance"})) {} 1 -eval instant at 50m absent(max(nonexistant)) +eval instant at 50m absent(max(nonexistent)) {} 1 -eval instant at 50m absent(nonexistant > 1) +eval instant at 50m absent(nonexistent > 1) {} 1 eval instant at 50m absent(a + b) @@ -757,7 +757,7 @@ eval instant at 50m absent(a + b) eval instant at 50m absent(a and b) {} 1 -eval instant at 50m absent(rate(nonexistant[5m])) +eval instant at 50m absent(rate(nonexistent[5m])) {} 1 clear @@ -775,7 +775,7 @@ eval instant at 1m absent_over_time(http_requests{handler!="/foo"}[5m]) eval instant at 1m absent_over_time(http_requests{handler="/foo", handler="/bar", handler="/foobar"}[5m]) {} 1 -eval instant at 1m absent_over_time(rate(nonexistant[5m])[5m:]) +eval instant at 1m absent_over_time(rate(nonexistent[5m])[5m:]) {} 1 eval instant at 1m absent_over_time(http_requests{handler="/foo", handler="/bar", instance="127.0.0.1"}[5m]) diff --git a/pkg/queryfrontend/cache.go b/pkg/queryfrontend/cache.go index 156d26b5c3..2629bc4e5f 100644 --- a/pkg/queryfrontend/cache.go +++ b/pkg/queryfrontend/cache.go @@ -12,13 +12,11 @@ import ( // thanosCacheKeyGenerator is a utility for using split interval when determining cache keys. type thanosCacheKeyGenerator struct { - interval queryrange.IntervalFn resolutions []int64 } -func newThanosCacheKeyGenerator(intervalFn queryrange.IntervalFn) thanosCacheKeyGenerator { +func newThanosCacheKeyGenerator() thanosCacheKeyGenerator { return thanosCacheKeyGenerator{ - interval: intervalFn, resolutions: []int64{downsample.ResLevel2, downsample.ResLevel1, downsample.ResLevel0}, } } @@ -26,20 +24,26 @@ func newThanosCacheKeyGenerator(intervalFn queryrange.IntervalFn) thanosCacheKey // GenerateCacheKey generates a cache key based on the Request and interval. // TODO(yeya24): Add other request params as request key. func (t thanosCacheKeyGenerator) GenerateCacheKey(userID string, r queryrange.Request) string { - currentInterval := r.GetStart() / t.interval(r).Milliseconds() - switch tr := r.(type) { - case *ThanosQueryRangeRequest: - i := 0 - for ; i < len(t.resolutions) && t.resolutions[i] > tr.MaxSourceResolution; i++ { + if sr, ok := r.(SplitRequest); ok { + splitInterval := sr.GetSplitInterval().Milliseconds() + currentInterval := r.GetStart() / splitInterval + + switch tr := r.(type) { + case *ThanosQueryRangeRequest: + i := 0 + for ; i < len(t.resolutions) && t.resolutions[i] > tr.MaxSourceResolution; i++ { + } + shardInfoKey := generateShardInfoKey(tr) + return fmt.Sprintf("fe:%s:%s:%d:%d:%d:%d:%s:%d:%s", userID, tr.Query, tr.Step, splitInterval, currentInterval, i, shardInfoKey, tr.LookbackDelta, tr.Engine) + case *ThanosLabelsRequest: + return fmt.Sprintf("fe:%s:%s:%s:%d:%d", userID, tr.Label, tr.Matchers, splitInterval, currentInterval) + case *ThanosSeriesRequest: + return fmt.Sprintf("fe:%s:%s:%d:%d", userID, tr.Matchers, splitInterval, currentInterval) } - shardInfoKey := generateShardInfoKey(tr) - return fmt.Sprintf("fe:%s:%s:%d:%d:%d:%s:%d:%s", userID, tr.Query, tr.Step, currentInterval, i, shardInfoKey, tr.LookbackDelta, tr.Engine) - case *ThanosLabelsRequest: - return fmt.Sprintf("fe:%s:%s:%s:%d", userID, tr.Label, tr.Matchers, currentInterval) - case *ThanosSeriesRequest: - return fmt.Sprintf("fe:%s:%s:%d", userID, tr.Matchers, currentInterval) } - return fmt.Sprintf("fe:%s:%s:%d:%d", userID, r.GetQuery(), r.GetStep(), currentInterval) + + // all possible request types are already covered + panic("request type not supported") } func generateShardInfoKey(r *ThanosQueryRangeRequest) string { diff --git a/pkg/queryfrontend/cache_test.go b/pkg/queryfrontend/cache_test.go index 9cd14ff2b8..32485c0d08 100644 --- a/pkg/queryfrontend/cache_test.go +++ b/pkg/queryfrontend/cache_test.go @@ -15,40 +15,32 @@ import ( ) func TestGenerateCacheKey(t *testing.T) { - intervalFn := func(r queryrange.Request) time.Duration { return hour } - splitter := newThanosCacheKeyGenerator(intervalFn) + splitter := newThanosCacheKeyGenerator() for _, tc := range []struct { name string req queryrange.Request expected string }{ - { - name: "non thanos req", - req: &queryrange.PrometheusRequest{ - Query: "up", - Start: 0, - Step: 60 * seconds, - }, - expected: "fe::up:60000:0", - }, { name: "non downsampling resolution specified", req: &ThanosQueryRangeRequest{ - Query: "up", - Start: 0, - Step: 60 * seconds, + Query: "up", + Start: 0, + Step: 60 * seconds, + SplitInterval: time.Hour, }, - expected: "fe::up:60000:0:2:-:0:", + expected: "fe::up:60000:3600000:0:2:-:0:", }, { name: "10s step", req: &ThanosQueryRangeRequest{ - Query: "up", - Start: 0, - Step: 10 * seconds, + Query: "up", + Start: 0, + Step: 10 * seconds, + SplitInterval: time.Hour, }, - expected: "fe::up:10000:0:2:-:0:", + expected: "fe::up:10000:3600000:0:2:-:0:", }, { name: "1m downsampling resolution", @@ -57,8 +49,9 @@ func TestGenerateCacheKey(t *testing.T) { Start: 0, Step: 10 * seconds, MaxSourceResolution: 60 * seconds, + SplitInterval: time.Hour, }, - expected: "fe::up:10000:0:2:-:0:", + expected: "fe::up:10000:3600000:0:2:-:0:", }, { name: "5m downsampling resolution, different cache key", @@ -67,8 +60,9 @@ func TestGenerateCacheKey(t *testing.T) { Start: 0, Step: 10 * seconds, MaxSourceResolution: 300 * seconds, + SplitInterval: time.Hour, }, - expected: "fe::up:10000:0:1:-:0:", + expected: "fe::up:10000:3600000:0:1:-:0:", }, { name: "1h downsampling resolution, different cache key", @@ -77,8 +71,9 @@ func TestGenerateCacheKey(t *testing.T) { Start: 0, Step: 10 * seconds, MaxSourceResolution: hour, + SplitInterval: time.Hour, }, - expected: "fe::up:10000:0:0:-:0:", + expected: "fe::up:10000:3600000:0:0:-:0:", }, { name: "1h downsampling resolution with lookback delta", @@ -88,23 +83,26 @@ func TestGenerateCacheKey(t *testing.T) { Step: 10 * seconds, MaxSourceResolution: hour, LookbackDelta: 1000, + SplitInterval: time.Hour, }, - expected: "fe::up:10000:0:0:-:1000:", + expected: "fe::up:10000:3600000:0:0:-:1000:", }, { name: "label names, no matcher", req: &ThanosLabelsRequest{ - Start: 0, + Start: 0, + SplitInterval: time.Hour, }, - expected: "fe:::[]:0", + expected: "fe:::[]:3600000:0", }, { name: "label names, single matcher", req: &ThanosLabelsRequest{ - Start: 0, - Matchers: [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}}, + Start: 0, + Matchers: [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}}, + SplitInterval: time.Hour, }, - expected: `fe:::[[foo="bar"]]:0`, + expected: `fe:::[[foo="bar"]]:3600000:0`, }, { name: "label names, multiple matchers", @@ -114,25 +112,28 @@ func TestGenerateCacheKey(t *testing.T) { {labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}, {labels.MustNewMatcher(labels.MatchEqual, "baz", "qux")}, }, + SplitInterval: time.Hour, }, - expected: `fe:::[[foo="bar"] [baz="qux"]]:0`, + expected: `fe:::[[foo="bar"] [baz="qux"]]:3600000:0`, }, { name: "label values, no matcher", req: &ThanosLabelsRequest{ - Start: 0, - Label: "up", + Start: 0, + Label: "up", + SplitInterval: time.Hour, }, - expected: "fe::up:[]:0", + expected: "fe::up:[]:3600000:0", }, { name: "label values, single matcher", req: &ThanosLabelsRequest{ - Start: 0, - Label: "up", - Matchers: [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}}, + Start: 0, + Label: "up", + Matchers: [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}}, + SplitInterval: time.Hour, }, - expected: `fe::up:[[foo="bar"]]:0`, + expected: `fe::up:[[foo="bar"]]:3600000:0`, }, { name: "label values, multiple matchers", @@ -143,8 +144,9 @@ func TestGenerateCacheKey(t *testing.T) { {labels.MustNewMatcher(labels.MatchEqual, "foo", "bar")}, {labels.MustNewMatcher(labels.MatchEqual, "baz", "qux")}, }, + SplitInterval: time.Hour, }, - expected: `fe::up:[[foo="bar"] [baz="qux"]]:0`, + expected: `fe::up:[[foo="bar"] [baz="qux"]]:3600000:0`, }, } { t.Run(tc.name, func(t *testing.T) { @@ -153,3 +155,23 @@ func TestGenerateCacheKey(t *testing.T) { }) } } + +func TestGenerateCacheKey_UnsupportedRequest(t *testing.T) { + splitter := newThanosCacheKeyGenerator() + + req := &queryrange.PrometheusRequest{ + Query: "up", + Start: 0, + Step: 60 * seconds, + } + + defer func() { + if r := recover(); r == nil { + t.Fatal("expected panic") + } else { + testutil.Assert(t, r == "request type not supported", "unexpected panic: %v", r) + } + }() + + splitter.GenerateCacheKey("", req) +} diff --git a/pkg/queryfrontend/config.go b/pkg/queryfrontend/config.go index 437f0cf9ad..aabb841405 100644 --- a/pkg/queryfrontend/config.go +++ b/pkg/queryfrontend/config.go @@ -162,13 +162,15 @@ func NewCacheConfig(logger log.Logger, confContentYaml []byte) (*cortexcache.Con } return &cortexcache.Config{ Redis: cortexcache.RedisConfig{ - Endpoint: config.Redis.Addr, - Timeout: config.Redis.ReadTimeout, - MasterName: config.Redis.MasterName, - Expiration: config.Expiration, - DB: config.Redis.DB, - Password: flagext.Secret{Value: config.Redis.Password}, - Username: config.Redis.Username, + Endpoint: config.Redis.Addr, + Timeout: config.Redis.ReadTimeout, + MasterName: config.Redis.MasterName, + Expiration: config.Expiration, + DB: config.Redis.DB, + Password: flagext.Secret{Value: config.Redis.Password}, + Username: config.Redis.Username, + EnableTLS: config.Redis.TLSEnabled, + InsecureSkipVerify: config.Redis.TLSConfig.InsecureSkipVerify, }, Background: cortexcache.BackgroundConfig{ WriteBackBuffer: config.Redis.MaxSetMultiConcurrency * config.Redis.SetMultiBatchSize, diff --git a/pkg/queryfrontend/labels_codec.go b/pkg/queryfrontend/labels_codec.go index c56d8b52fc..0557652b35 100644 --- a/pkg/queryfrontend/labels_codec.go +++ b/pkg/queryfrontend/labels_codec.go @@ -107,7 +107,10 @@ func (c labelsCodec) MergeResponse(_ queryrange.Request, responses ...queryrange func (c labelsCodec) DecodeRequest(_ context.Context, r *http.Request, forwardHeaders []string) (queryrange.Request, error) { if err := r.ParseForm(); err != nil { - return nil, httpgrpc.Errorf(http.StatusBadRequest, err.Error()) + return nil, httpgrpc.ErrorFromHTTPResponse(&httpgrpc.HTTPResponse{ + Code: int32(http.StatusBadRequest), + Body: []byte(err.Error()), + }) } var ( @@ -207,7 +210,10 @@ func (c labelsCodec) EncodeRequest(ctx context.Context, r queryrange.Request) (* func (c labelsCodec) DecodeResponse(ctx context.Context, r *http.Response, req queryrange.Request) (queryrange.Response, error) { if r.StatusCode/100 != 2 { body, _ := io.ReadAll(r.Body) - return nil, httpgrpc.Errorf(r.StatusCode, string(body)) + return nil, httpgrpc.ErrorFromHTTPResponse(&httpgrpc.HTTPResponse{ + Code: int32(r.StatusCode), + Body: body, + }) } log, _ := spanlogger.New(ctx, "ParseQueryResponse") //nolint:ineffassign,staticcheck defer log.Finish() diff --git a/pkg/queryfrontend/queryinstant_codec.go b/pkg/queryfrontend/queryinstant_codec.go index edd412a4a9..8e598fbd91 100644 --- a/pkg/queryfrontend/queryinstant_codec.go +++ b/pkg/queryfrontend/queryinstant_codec.go @@ -17,6 +17,7 @@ import ( "github.com/opentracing/opentracing-go" otlog "github.com/opentracing/opentracing-go/log" "github.com/prometheus/common/model" + "github.com/prometheus/prometheus/promql/parser" "github.com/weaveworks/common/httpgrpc" "github.com/prometheus/prometheus/promql/parser" @@ -25,6 +26,7 @@ import ( cortexutil "github.com/thanos-io/thanos/internal/cortex/util" "github.com/thanos-io/thanos/internal/cortex/util/spanlogger" queryv1 "github.com/thanos-io/thanos/pkg/api/query" + "github.com/thanos-io/thanos/pkg/extpromql" ) // queryInstantCodec is used to encode/decode Thanos instant query requests and responses. @@ -163,6 +165,7 @@ func (c queryInstantCodec) DecodeRequest(_ context.Context, r *http.Request, for result.Query = r.FormValue("query") result.Path = r.URL.Path result.Engine = r.FormValue("engine") + result.Stats = r.FormValue(queryv1.Stats) for _, header := range forwardHeaders { for h, hv := range r.Header { @@ -188,6 +191,7 @@ func (c queryInstantCodec) EncodeRequest(ctx context.Context, r queryrange.Reque queryv1.PartialResponseParam: []string{strconv.FormatBool(thanosReq.PartialResponse)}, queryv1.EngineParam: []string{thanosReq.Engine}, queryv1.ReplicaLabelsParam: thanosReq.ReplicaLabels, + queryv1.Stats: []string{thanosReq.Stats}, } if thanosReq.Time > 0 { @@ -260,7 +264,10 @@ func (c queryInstantCodec) EncodeResponse(ctx context.Context, res queryrange.Re func (c queryInstantCodec) DecodeResponse(ctx context.Context, r *http.Response, req queryrange.Request) (queryrange.Response, error) { if r.StatusCode/100 != 2 { body, _ := io.ReadAll(r.Body) - return nil, httpgrpc.Errorf(r.StatusCode, string(body)) + return nil, httpgrpc.ErrorFromHTTPResponse(&httpgrpc.HTTPResponse{ + Code: int32(r.StatusCode), + Body: body, + }) } log, ctx := spanlogger.New(ctx, "ParseQueryInstantResponse") //nolint:ineffassign,staticcheck defer log.Finish() @@ -370,7 +377,7 @@ const ( ) func sortPlanForQuery(q string) (sortPlan, error) { - expr, err := parser.ParseExpr(q) + expr, err := extpromql.ParseExpr(q) if err != nil { return 0, err } diff --git a/pkg/queryfrontend/queryinstant_codec_test.go b/pkg/queryfrontend/queryinstant_codec_test.go index 3d60cf6960..50d18bdf19 100644 --- a/pkg/queryfrontend/queryinstant_codec_test.go +++ b/pkg/queryfrontend/queryinstant_codec_test.go @@ -16,6 +16,7 @@ import ( "github.com/weaveworks/common/httpgrpc" "github.com/efficientgo/core/testutil" + "github.com/thanos-io/thanos/internal/cortex/cortexpb" "github.com/thanos-io/thanos/internal/cortex/querier/queryrange" queryv1 "github.com/thanos-io/thanos/pkg/api/query" @@ -165,6 +166,17 @@ func TestQueryInstantCodec_DecodeRequest(t *testing.T) { StoreMatchers: [][]*labels.Matcher{}, }, }, + { + name: "forwards stats parameter", + url: "/api/v1/query?stats=all", + partialResponse: false, + expectedRequest: &ThanosQueryInstantRequest{ + Path: "/api/v1/query", + Stats: "all", + Dedup: true, + StoreMatchers: [][]*labels.Matcher{}, + }, + }, } { t.Run(tc.name, func(t *testing.T) { r, err := http.NewRequest(http.MethodGet, tc.url, nil) @@ -176,7 +188,7 @@ func TestQueryInstantCodec_DecodeRequest(t *testing.T) { testutil.Equals(t, err, tc.expectedError) } else { testutil.Ok(t, err) - testutil.Equals(t, req, tc.expectedRequest) + testutil.Equals(t, tc.expectedRequest, req) } }) } diff --git a/pkg/queryfrontend/queryrange_codec.go b/pkg/queryfrontend/queryrange_codec.go index fca6ea7fc7..a03be8f937 100644 --- a/pkg/queryfrontend/queryrange_codec.go +++ b/pkg/queryfrontend/queryrange_codec.go @@ -16,13 +16,12 @@ import ( "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" - "github.com/prometheus/prometheus/promql/parser" "github.com/weaveworks/common/httpgrpc" "github.com/thanos-io/thanos/internal/cortex/querier/queryrange" cortexutil "github.com/thanos-io/thanos/internal/cortex/util" - queryv1 "github.com/thanos-io/thanos/pkg/api/query" + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/store/storepb" ) @@ -137,6 +136,7 @@ func (c queryRangeCodec) DecodeRequest(_ context.Context, r *http.Request, forwa } result.Engine = r.FormValue(queryv1.EngineParam) result.Path = r.URL.Path + result.Stats = r.FormValue(queryv1.Stats) for _, value := range r.Header.Values(cacheControlHeader) { if strings.Contains(value, noStoreValue) { @@ -171,6 +171,7 @@ func (c queryRangeCodec) EncodeRequest(ctx context.Context, r queryrange.Request queryv1.DedupParam: []string{strconv.FormatBool(thanosReq.Dedup)}, queryv1.PartialResponseParam: []string{strconv.FormatBool(thanosReq.PartialResponse)}, queryv1.ReplicaLabelsParam: thanosReq.ReplicaLabels, + queryv1.Stats: []string{thanosReq.Stats}, } if thanosReq.AutoDownsampling { @@ -269,7 +270,7 @@ func parsePartialResponseParam(s string, defaultEnablePartialResponse bool) (boo func parseMatchersParam(ss url.Values, matcherParam string) ([][]*labels.Matcher, error) { matchers := make([][]*labels.Matcher, 0, len(ss[matcherParam])) for _, s := range ss[matcherParam] { - ms, err := parser.ParseMetricSelector(s) + ms, err := extpromql.ParseMetricSelector(s) if err != nil { return nil, httpgrpc.Errorf(http.StatusBadRequest, errCannotParse, matcherParam) } diff --git a/pkg/queryfrontend/queryrange_codec_test.go b/pkg/queryfrontend/queryrange_codec_test.go index d4f068e94e..c0042677b8 100644 --- a/pkg/queryfrontend/queryrange_codec_test.go +++ b/pkg/queryfrontend/queryrange_codec_test.go @@ -15,6 +15,7 @@ import ( "github.com/thanos-io/thanos/internal/cortex/querier/queryrange" "github.com/efficientgo/core/testutil" + queryv1 "github.com/thanos-io/thanos/pkg/api/query" "github.com/thanos-io/thanos/pkg/compact" ) @@ -298,6 +299,21 @@ func TestQueryRangeCodec_EncodeRequest(t *testing.T) { r.FormValue(queryv1.LookbackDeltaParam) == "1" }, }, + { + name: "Request with stats", + req: &ThanosQueryRangeRequest{ + Start: 123000, + End: 456000, + Step: 1000, + Stats: "all", + }, + checkFunc: func(r *http.Request) bool { + return r.FormValue("start") == "123" && + r.FormValue("end") == "456" && + r.FormValue("step") == "1" && + r.FormValue("stats") == "all" + }, + }, } { t.Run(tc.name, func(t *testing.T) { // Default partial response value doesn't matter when encoding requests. diff --git a/pkg/queryfrontend/request.go b/pkg/queryfrontend/request.go index 4a6fb3f0d8..69c98682d3 100644 --- a/pkg/queryfrontend/request.go +++ b/pkg/queryfrontend/request.go @@ -27,6 +27,12 @@ type ShardedRequest interface { WithShardInfo(info *storepb.ShardInfo) queryrange.Request } +// SplitRequest interface represents a query request that can be split horizontally. +type SplitRequest interface { + GetSplitInterval() time.Duration + WithSplitInterval(interval time.Duration) queryrange.Request +} + type RequestHeader struct { Name string Values []string @@ -57,6 +63,7 @@ type ThanosQueryRangeRequest struct { LookbackDelta int64 Analyze bool Engine string + SplitInterval time.Duration } // IsDedupEnabled returns true if deduplication is enabled. @@ -83,6 +90,8 @@ func (r *ThanosQueryRangeRequest) GetCachingOptions() queryrange.CachingOptions func (r *ThanosQueryRangeRequest) GetStats() string { return r.Stats } +func (r *ThanosQueryRangeRequest) GetSplitInterval() time.Duration { return r.SplitInterval } + func (r *ThanosQueryRangeRequest) WithStats(stats string) queryrange.Request { q := *r q.Stats = stats @@ -111,6 +120,13 @@ func (r *ThanosQueryRangeRequest) WithShardInfo(info *storepb.ShardInfo) queryra return &q } +// WithSplitInterval clones the current request with a different split interval. +func (r *ThanosQueryRangeRequest) WithSplitInterval(interval time.Duration) queryrange.Request { + q := *r + q.SplitInterval = interval + return &q +} + // LogToSpan writes information about this request to an OpenTracing span. func (r *ThanosQueryRangeRequest) LogToSpan(sp opentracing.Span) { fields := []otlog.Field{ @@ -246,6 +262,7 @@ type ThanosLabelsRequest struct { CachingOptions queryrange.CachingOptions Headers []*RequestHeader Stats string + SplitInterval time.Duration } // GetStoreMatchers returns store matches. @@ -268,6 +285,8 @@ func (r *ThanosLabelsRequest) GetCachingOptions() queryrange.CachingOptions { re func (r *ThanosLabelsRequest) GetStats() string { return r.Stats } +func (r *ThanosLabelsRequest) GetSplitInterval() time.Duration { return r.SplitInterval } + func (r *ThanosLabelsRequest) WithStats(stats string) queryrange.Request { q := *r q.Stats = stats @@ -288,6 +307,13 @@ func (r *ThanosLabelsRequest) WithQuery(_ string) queryrange.Request { return &q } +// WithSplitInterval clones the current request with a different split interval. +func (r *ThanosLabelsRequest) WithSplitInterval(interval time.Duration) queryrange.Request { + q := *r + q.SplitInterval = interval + return &q +} + // LogToSpan writes information about this request to an OpenTracing span. func (r *ThanosLabelsRequest) LogToSpan(sp opentracing.Span) { fields := []otlog.Field{ @@ -328,6 +354,7 @@ type ThanosSeriesRequest struct { CachingOptions queryrange.CachingOptions Headers []*RequestHeader Stats string + SplitInterval time.Duration } // IsDedupEnabled returns true if deduplication is enabled. @@ -353,6 +380,8 @@ func (r *ThanosSeriesRequest) GetCachingOptions() queryrange.CachingOptions { re func (r *ThanosSeriesRequest) GetStats() string { return r.Stats } +func (r *ThanosSeriesRequest) GetSplitInterval() time.Duration { return r.SplitInterval } + func (r *ThanosSeriesRequest) WithStats(stats string) queryrange.Request { q := *r q.Stats = stats @@ -373,6 +402,13 @@ func (r *ThanosSeriesRequest) WithQuery(_ string) queryrange.Request { return &q } +// WithSplitInterval clones the current request with a different split interval. +func (r *ThanosSeriesRequest) WithSplitInterval(interval time.Duration) queryrange.Request { + q := *r + q.SplitInterval = interval + return &q +} + // LogToSpan writes information about this request to an OpenTracing span. func (r *ThanosSeriesRequest) LogToSpan(sp opentracing.Span) { fields := []otlog.Field{ diff --git a/pkg/queryfrontend/roundtrip.go b/pkg/queryfrontend/roundtrip.go index b901950ba8..095799e68d 100644 --- a/pkg/queryfrontend/roundtrip.go +++ b/pkg/queryfrontend/roundtrip.go @@ -62,6 +62,7 @@ func NewTripperware(config Config, reg prometheus.Registerer, logger log.Logger) queryRangeLimits, queryRangeCodec, config.NumShards, + config.CortexHandlerConfig.QueryStatsEnabled, prometheus.WrapRegistererWith(prometheus.Labels{"tripperware": "query_range"}, reg), logger, config.ForwardHeaders) if err != nil { return nil, err @@ -78,6 +79,7 @@ func NewTripperware(config Config, reg prometheus.Registerer, logger log.Logger) queryInstantCodec, prometheus.WrapRegistererWith(prometheus.Labels{"tripperware": "query_instant"}, reg), config.ForwardHeaders, + config.CortexHandlerConfig.QueryStatsEnabled, ) return func(next http.RoundTripper) http.RoundTripper { tripper := newRoundTripper( @@ -162,6 +164,7 @@ func newQueryRangeTripperware( limits queryrange.Limits, codec *queryRangeCodec, numShards int, + forceStats bool, reg prometheus.Registerer, logger log.Logger, forwardHeaders []string, @@ -169,6 +172,11 @@ func newQueryRangeTripperware( queryRangeMiddleware := []queryrange.Middleware{queryrange.NewLimitsMiddleware(limits)} m := queryrange.NewInstrumentMiddlewareMetrics(reg) + queryRangeMiddleware = append( + queryRangeMiddleware, + queryrange.NewStatsMiddleware(forceStats), + ) + // step align middleware. if config.AlignRangeWithStep { queryRangeMiddleware = append( @@ -208,7 +216,7 @@ func newQueryRangeTripperware( queryCacheMiddleware, _, err := queryrange.NewResultsCacheMiddleware( logger, *config.ResultsCacheConfig, - newThanosCacheKeyGenerator(dynamicIntervalFn(config)), + newThanosCacheKeyGenerator(), limits, codec, queryrange.PrometheusResponseExtractor{}, @@ -291,11 +299,10 @@ func newLabelsTripperware( } if config.ResultsCacheConfig != nil { - staticIntervalFn := func(_ queryrange.Request) time.Duration { return config.SplitQueriesByInterval } queryCacheMiddleware, _, err := queryrange.NewResultsCacheMiddleware( logger, *config.ResultsCacheConfig, - newThanosCacheKeyGenerator(staticIntervalFn), + newThanosCacheKeyGenerator(), limits, codec, ThanosResponseExtractor{}, @@ -335,8 +342,9 @@ func newInstantQueryTripperware( codec queryrange.Codec, reg prometheus.Registerer, forwardHeaders []string, + forceStats bool, ) queryrange.Tripperware { - instantQueryMiddlewares := []queryrange.Middleware{} + var instantQueryMiddlewares []queryrange.Middleware m := queryrange.NewInstrumentMiddlewareMetrics(reg) if numShards > 0 { analyzer := querysharding.NewQueryAnalyzer() @@ -347,6 +355,11 @@ func newInstantQueryTripperware( ) } + instantQueryMiddlewares = append( + instantQueryMiddlewares, + queryrange.NewStatsMiddleware(forceStats), + ) + return func(next http.RoundTripper) http.RoundTripper { rt := queryrange.NewRoundTripper(next, codec, forwardHeaders, instantQueryMiddlewares...) return queryrange.RoundTripFunc(func(r *http.Request) (*http.Response, error) { diff --git a/pkg/queryfrontend/roundtrip_test.go b/pkg/queryfrontend/roundtrip_test.go index 7733191e47..457f922717 100644 --- a/pkg/queryfrontend/roundtrip_test.go +++ b/pkg/queryfrontend/roundtrip_test.go @@ -13,17 +13,17 @@ import ( "testing" "time" - "go.uber.org/atomic" - + "github.com/efficientgo/core/testutil" "github.com/go-kit/log" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/promql/parser" "github.com/weaveworks/common/user" + "go.uber.org/atomic" - "github.com/efficientgo/core/testutil" cortexcache "github.com/thanos-io/thanos/internal/cortex/chunk/cache" "github.com/thanos-io/thanos/internal/cortex/cortexpb" + "github.com/thanos-io/thanos/internal/cortex/frontend/transport" "github.com/thanos-io/thanos/internal/cortex/querier/queryrange" cortexvalidation "github.com/thanos-io/thanos/internal/cortex/util/validation" "github.com/thanos-io/thanos/pkg/store/labelpb" @@ -186,6 +186,7 @@ func TestRoundTripRetryMiddleware(t *testing.T) { t.Run(tc.name, func(t *testing.T) { tpw, err := NewTripperware( Config{ + CortexHandlerConfig: &transport.HandlerConfig{}, QueryRangeConfig: QueryRangeConfig{ MaxRetries: tc.maxRetries, Limits: defaultLimits, @@ -357,6 +358,7 @@ func TestRoundTripSplitIntervalMiddleware(t *testing.T) { t.Run(tc.name, func(t *testing.T) { tpw, err := NewTripperware( Config{ + CortexHandlerConfig: &transport.HandlerConfig{}, QueryRangeConfig: QueryRangeConfig{ Limits: defaultLimits, SplitQueriesByInterval: tc.splitInterval, @@ -461,6 +463,7 @@ func TestRoundTripQueryRangeCacheMiddleware(t *testing.T) { tpw, err := NewTripperware( Config{ + CortexHandlerConfig: &transport.HandlerConfig{}, QueryRangeConfig: QueryRangeConfig{ Limits: defaultLimits, ResultsCacheConfig: cacheConf, @@ -558,6 +561,7 @@ func TestRoundTripQueryCacheWithShardingMiddleware(t *testing.T) { ResultsCacheConfig: cacheConf, SplitQueriesByInterval: day, }, + CortexHandlerConfig: &transport.HandlerConfig{}, }, nil, log.NewNopLogger(), ) testutil.Ok(t, err) @@ -682,6 +686,7 @@ func TestRoundTripLabelsCacheMiddleware(t *testing.T) { ResultsCacheConfig: cacheConf, SplitQueriesByInterval: day, }, + CortexHandlerConfig: &transport.HandlerConfig{}, }, nil, log.NewNopLogger(), ) testutil.Ok(t, err) @@ -790,6 +795,7 @@ func TestRoundTripSeriesCacheMiddleware(t *testing.T) { tpw, err := NewTripperware( Config{ + CortexHandlerConfig: &transport.HandlerConfig{}, LabelsConfig: LabelsConfig{ Limits: defaultLimits, ResultsCacheConfig: cacheConf, diff --git a/pkg/queryfrontend/split_by_interval.go b/pkg/queryfrontend/split_by_interval.go index 9d79512303..68d6127f56 100644 --- a/pkg/queryfrontend/split_by_interval.go +++ b/pkg/queryfrontend/split_by_interval.go @@ -8,10 +8,12 @@ package queryfrontend import ( "context" + "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/weaveworks/common/httpgrpc" "github.com/thanos-io/thanos/internal/cortex/querier/queryrange" ) @@ -71,7 +73,9 @@ func (s splitByInterval) Do(ctx context.Context, r queryrange.Request) (queryran func splitQuery(r queryrange.Request, interval time.Duration) ([]queryrange.Request, error) { var reqs []queryrange.Request - if _, ok := r.(*ThanosQueryRangeRequest); ok { + + switch tr := r.(type) { + case *ThanosQueryRangeRequest: // Replace @ modifier function to their respective constant values in the query. // This way subqueries will be evaluated at the same time as the parent query. query, err := queryrange.EvaluateAtModifierFunction(r.GetQuery(), r.GetStart(), r.GetEnd()) @@ -79,7 +83,7 @@ func splitQuery(r queryrange.Request, interval time.Duration) ([]queryrange.Requ return nil, err } if start := r.GetStart(); start == r.GetEnd() { - reqs = append(reqs, r.WithStartEnd(start, start)) + reqs = append(reqs, tr.WithSplitInterval(interval).WithStartEnd(start, start)) } else { for ; start < r.GetEnd(); start = nextIntervalBoundary(start, r.GetStep(), interval) + r.GetStep() { end := nextIntervalBoundary(start, r.GetStep(), interval) @@ -87,10 +91,10 @@ func splitQuery(r queryrange.Request, interval time.Duration) ([]queryrange.Requ end = r.GetEnd() } - reqs = append(reqs, r.WithQuery(query).WithStartEnd(start, end)) + reqs = append(reqs, tr.WithSplitInterval(interval).WithQuery(query).WithStartEnd(start, end)) } } - } else { + case SplitRequest: dur := int64(interval / time.Millisecond) for start := r.GetStart(); start < r.GetEnd(); start = start + dur { end := start + dur @@ -98,8 +102,10 @@ func splitQuery(r queryrange.Request, interval time.Duration) ([]queryrange.Requ end = r.GetEnd() } - reqs = append(reqs, r.WithStartEnd(start, end)) + reqs = append(reqs, tr.WithSplitInterval(interval).WithStartEnd(start, end)) } + default: + return nil, httpgrpc.Errorf(http.StatusBadRequest, `{"status": "error", "error": "request type %T not supported"}`, r) } return reqs, nil diff --git a/pkg/queryfrontend/split_by_interval_test.go b/pkg/queryfrontend/split_by_interval_test.go index 560fd51496..11469f9406 100644 --- a/pkg/queryfrontend/split_by_interval_test.go +++ b/pkg/queryfrontend/split_by_interval_test.go @@ -30,10 +30,11 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 0, - End: 60 * 60 * seconds, - Step: 15 * seconds, - Query: "foo", + Start: 0, + End: 60 * 60 * seconds, + Step: 15 * seconds, + Query: "foo", + SplitInterval: day, }, }, interval: day, @@ -47,10 +48,11 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 60 * 60 * seconds, - End: 60 * 60 * seconds, - Step: 15 * seconds, - Query: "foo", + Start: 60 * 60 * seconds, + End: 60 * 60 * seconds, + Step: 15 * seconds, + Query: "foo", + SplitInterval: day, }, }, interval: day, @@ -64,10 +66,11 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 0, - End: 60 * 60 * seconds, - Step: 15 * seconds, - Query: "foo", + Start: 0, + End: 60 * 60 * seconds, + Step: 15 * seconds, + Query: "foo", + SplitInterval: 3 * time.Hour, }, }, interval: 3 * time.Hour, @@ -81,10 +84,11 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 0, - End: 24 * 3600 * seconds, - Step: 15 * seconds, - Query: "foo", + Start: 0, + End: 24 * 3600 * seconds, + Step: 15 * seconds, + Query: "foo", + SplitInterval: day, }, }, interval: day, @@ -98,10 +102,11 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 0, - End: 3 * 3600 * seconds, - Step: 15 * seconds, - Query: "foo", + Start: 0, + End: 3 * 3600 * seconds, + Step: 15 * seconds, + Query: "foo", + SplitInterval: 3 * time.Hour, }, }, interval: 3 * time.Hour, @@ -115,16 +120,18 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 0, - End: (24 * 3600 * seconds) - (15 * seconds), - Step: 15 * seconds, - Query: "foo @ 0.000", + Start: 0, + End: (24 * 3600 * seconds) - (15 * seconds), + Step: 15 * seconds, + Query: "foo @ 0.000", + SplitInterval: day, }, &ThanosQueryRangeRequest{ - Start: 24 * 3600 * seconds, - End: 2 * 24 * 3600 * seconds, - Step: 15 * seconds, - Query: "foo @ 0.000", + Start: 24 * 3600 * seconds, + End: 2 * 24 * 3600 * seconds, + Step: 15 * seconds, + Query: "foo @ 0.000", + SplitInterval: day, }, }, interval: day, @@ -138,16 +145,18 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 0, - End: (24 * 3600 * seconds) - (15 * seconds), - Step: 15 * seconds, - Query: "foo @ 172800.000", + Start: 0, + End: (24 * 3600 * seconds) - (15 * seconds), + Step: 15 * seconds, + Query: "foo @ 172800.000", + SplitInterval: day, }, &ThanosQueryRangeRequest{ - Start: 24 * 3600 * seconds, - End: 2 * 24 * 3600 * seconds, - Step: 15 * seconds, - Query: "foo @ 172800.000", + Start: 24 * 3600 * seconds, + End: 2 * 24 * 3600 * seconds, + Step: 15 * seconds, + Query: "foo @ 172800.000", + SplitInterval: day, }, }, interval: day, @@ -161,16 +170,18 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 0, - End: (3 * 3600 * seconds) - (15 * seconds), - Step: 15 * seconds, - Query: "foo", + Start: 0, + End: (3 * 3600 * seconds) - (15 * seconds), + Step: 15 * seconds, + Query: "foo", + SplitInterval: 3 * time.Hour, }, &ThanosQueryRangeRequest{ - Start: 3 * 3600 * seconds, - End: 2 * 3 * 3600 * seconds, - Step: 15 * seconds, - Query: "foo", + Start: 3 * 3600 * seconds, + End: 2 * 3 * 3600 * seconds, + Step: 15 * seconds, + Query: "foo", + SplitInterval: 3 * time.Hour, }, }, interval: 3 * time.Hour, @@ -184,22 +195,25 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 3 * 3600 * seconds, - End: (24 * 3600 * seconds) - (15 * seconds), - Step: 15 * seconds, - Query: "foo", + Start: 3 * 3600 * seconds, + End: (24 * 3600 * seconds) - (15 * seconds), + Step: 15 * seconds, + Query: "foo", + SplitInterval: day, }, &ThanosQueryRangeRequest{ - Start: 24 * 3600 * seconds, - End: (2 * 24 * 3600 * seconds) - (15 * seconds), - Step: 15 * seconds, - Query: "foo", + Start: 24 * 3600 * seconds, + End: (2 * 24 * 3600 * seconds) - (15 * seconds), + Step: 15 * seconds, + Query: "foo", + SplitInterval: day, }, &ThanosQueryRangeRequest{ - Start: 2 * 24 * 3600 * seconds, - End: 3 * 24 * 3600 * seconds, - Step: 15 * seconds, - Query: "foo", + Start: 2 * 24 * 3600 * seconds, + End: 3 * 24 * 3600 * seconds, + Step: 15 * seconds, + Query: "foo", + SplitInterval: day, }, }, interval: day, @@ -213,22 +227,25 @@ func TestSplitQuery(t *testing.T) { }, expected: []queryrange.Request{ &ThanosQueryRangeRequest{ - Start: 2 * 3600 * seconds, - End: (3 * 3600 * seconds) - (15 * seconds), - Step: 15 * seconds, - Query: "foo", + Start: 2 * 3600 * seconds, + End: (3 * 3600 * seconds) - (15 * seconds), + Step: 15 * seconds, + Query: "foo", + SplitInterval: 3 * time.Hour, }, &ThanosQueryRangeRequest{ - Start: 3 * 3600 * seconds, - End: (2 * 3 * 3600 * seconds) - (15 * seconds), - Step: 15 * seconds, - Query: "foo", + Start: 3 * 3600 * seconds, + End: (2 * 3 * 3600 * seconds) - (15 * seconds), + Step: 15 * seconds, + Query: "foo", + SplitInterval: 3 * time.Hour, }, &ThanosQueryRangeRequest{ - Start: 2 * 3 * 3600 * seconds, - End: 3 * 3 * 3600 * seconds, - Step: 15 * seconds, - Query: "foo", + Start: 2 * 3 * 3600 * seconds, + End: 3 * 3 * 3600 * seconds, + Step: 15 * seconds, + Query: "foo", + SplitInterval: 3 * time.Hour, }, }, interval: 3 * time.Hour, @@ -258,3 +275,20 @@ func TestSplitQuery_PromQLErrorReturnsJson(t *testing.T) { require.True(t, json.Valid(resp.Body), "error message is not valid JSON: %s", resp.Body) } + +func TestSplitQuery_PrometheusRequest(t *testing.T) { + input := &queryrange.PrometheusRequest{ + Start: 2 * 3600 * seconds, + End: 3 * 3 * 3600 * seconds, + Step: 15 * seconds, + Query: "foo", + } + queries, err := splitQuery(input, 1*time.Hour) + require.Error(t, err) + require.Nil(t, queries) + + resp, ok := httpgrpc.HTTPResponseFromError(err) + require.True(t, ok, "could not assemble httpgrpc.HTTPResponse, is not status.Status") + + require.True(t, json.Valid(resp.Body), "error message is not valid JSON: %s", resp.Body) +} diff --git a/pkg/querysharding/analyzer.go b/pkg/querysharding/analyzer.go index 7b8e849bca..c07b943a21 100644 --- a/pkg/querysharding/analyzer.go +++ b/pkg/querysharding/analyzer.go @@ -22,6 +22,12 @@ import ( lru "github.com/hashicorp/golang-lru/v2" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/promql/parser" + + "github.com/thanos-io/thanos/pkg/extpromql" +) + +var ( + notShardableErr = fmt.Errorf("expressions are not shardable") ) var ( @@ -88,7 +94,7 @@ func (a *CachedQueryAnalyzer) Analyze(query string) (QueryAnalysis, error) { // // The le label is excluded from sharding. func (a *QueryAnalyzer) Analyze(query string) (QueryAnalysis, error) { - expr, err := parser.ParseExpr(query) + expr, err := extpromql.ParseExpr(query) if err != nil { return nonShardableQuery(), err } diff --git a/pkg/receive/capnp_server.go b/pkg/receive/capnp_server.go new file mode 100644 index 0000000000..3ca359744b --- /dev/null +++ b/pkg/receive/capnp_server.go @@ -0,0 +1,106 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package receive + +import ( + "context" + "net" + + "capnproto.org/go/capnp/v3" + "capnproto.org/go/capnp/v3/rpc" + "github.com/go-kit/log" + "github.com/go-kit/log/level" + "github.com/pkg/errors" + + "github.com/thanos-io/thanos/pkg/receive/writecapnp" +) + +type CapNProtoServer struct { + listener net.Listener + server writecapnp.Writer + logger log.Logger +} + +func NewCapNProtoServer(listener net.Listener, handler *CapNProtoHandler, logger log.Logger) *CapNProtoServer { + return &CapNProtoServer{ + listener: listener, + server: writecapnp.Writer_ServerToClient(handler), + logger: logger, + } +} + +func (c *CapNProtoServer) ListenAndServe() error { + for { + conn, err := c.listener.Accept() + if err != nil { + return err + } + + go func() { + rpcConn := rpc.NewConn(rpc.NewPackedStreamTransport(conn), &rpc.Options{ + // The BootstrapClient is the RPC interface that will be made available + // to the remote endpoint by default. + BootstrapClient: capnp.Client(c.server).AddRef(), + }) + <-rpcConn.Done() + }() + } +} + +func (c *CapNProtoServer) Shutdown() { + c.server.Release() +} + +type CapNProtoHandler struct { + writer *CapNProtoWriter + logger log.Logger +} + +func NewCapNProtoHandler(logger log.Logger, writer *CapNProtoWriter) *CapNProtoHandler { + return &CapNProtoHandler{logger: logger, writer: writer} +} + +func (c CapNProtoHandler) Write(ctx context.Context, call writecapnp.Writer_write) error { + call.Go() + wr, err := call.Args().Wr() + if err != nil { + return err + } + t, err := wr.Tenant() + if err != nil { + return err + } + req, err := writecapnp.NewRequest(wr) + if err != nil { + return err + } + defer req.Close() + + var errs writeErrors + errs.Add(c.writer.Write(ctx, t, req)) + if err := errs.ErrOrNil(); err != nil { + level.Debug(c.logger).Log("msg", "failed to handle request", "err", err) + result, allocErr := call.AllocResults() + if allocErr != nil { + return allocErr + } + + switch errors.Cause(err) { + case nil: + return nil + case errNotReady: + result.SetError(writecapnp.WriteError_unavailable) + case errUnavailable: + result.SetError(writecapnp.WriteError_unavailable) + case errConflict: + result.SetError(writecapnp.WriteError_alreadyExists) + case errBadReplica: + result.SetError(writecapnp.WriteError_invalidArgument) + default: + result.SetError(writecapnp.WriteError_internal) + } + } + + return nil +} diff --git a/pkg/receive/capnproto_server_bench_test.go b/pkg/receive/capnproto_server_bench_test.go new file mode 100644 index 0000000000..ba8d176dad --- /dev/null +++ b/pkg/receive/capnproto_server_bench_test.go @@ -0,0 +1,79 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package receive + +import ( + "context" + "os" + "testing" + + "github.com/go-kit/log" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/test/bufconn" + + "github.com/thanos-io/thanos/pkg/receive/writecapnp" + "github.com/thanos-io/thanos/pkg/store/labelpb" + "github.com/thanos-io/thanos/pkg/store/storepb" + "github.com/thanos-io/thanos/pkg/store/storepb/prompb" +) + +func BenchmarkCapNProtoServer_SingleConcurrentClient(b *testing.B) { + wreq := storepb.WriteRequest{ + Tenant: "example-tenant", + Timeseries: []prompb.TimeSeries{ + { + Labels: []labelpb.ZLabel{ + {Name: "__name__", Value: "up"}, + {Name: "job", Value: "prometheus"}, + }, + Samples: []prompb.Sample{ + {Timestamp: 1, Value: 1}, + {Timestamp: 2, Value: 2}, + }, + }, + { + Labels: []labelpb.ZLabel{ + {Name: "__name__", Value: "up"}, + {Name: "job", Value: "thanos"}, + }, + Samples: []prompb.Sample{ + {Timestamp: 3, Value: 3}, + {Timestamp: 4, Value: 4}, + }, + }, + }, + } + + var ( + writer = NewCapNProtoWriter( + log.NewNopLogger(), + newFakeTenantAppendable( + &fakeAppendable{appender: newFakeAppender(nil, nil, nil)}), + &CapNProtoWriterOptions{}, + ) + listener = bufconn.Listen(1024) + handler = NewCapNProtoHandler(log.NewNopLogger(), writer) + srv = NewCapNProtoServer(listener, handler, log.NewNopLogger()) + ) + go func() { + _ = srv.ListenAndServe() + }() + defer srv.Shutdown() + + const numIterations = 10000 + var totalWrites float64 + b.ResetTimer() + b.ReportAllocs() + client := writecapnp.NewRemoteWriteClient(listener, log.NewLogfmtLogger(os.Stdout)) + for i := 0; i < b.N; i++ { + for j := 0; j < numIterations; j++ { + _, err := client.RemoteWrite(context.Background(), &wreq) + require.NoError(b, err) + } + totalWrites += numIterations + } + require.NoError(b, client.Close()) + require.NoError(b, listener.Close()) + b.ReportMetric(totalWrites, "total_writes") +} diff --git a/pkg/receive/capnproto_server_test.go b/pkg/receive/capnproto_server_test.go new file mode 100644 index 0000000000..d2e994e313 --- /dev/null +++ b/pkg/receive/capnproto_server_test.go @@ -0,0 +1,80 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package receive + +import ( + "context" + "os" + "testing" + + "github.com/go-kit/log" + "github.com/stretchr/testify/require" + "google.golang.org/grpc/test/bufconn" + + "github.com/thanos-io/thanos/pkg/receive/writecapnp" + "github.com/thanos-io/thanos/pkg/store/storepb" +) + +func TestCapNProtoServer_SingleConcurrentClient(t *testing.T) { + t.Parallel() + + var ( + writer = NewCapNProtoWriter( + log.NewNopLogger(), + newFakeTenantAppendable( + &fakeAppendable{appender: newFakeAppender(nil, nil, nil)}), + &CapNProtoWriterOptions{}, + ) + listener = bufconn.Listen(1024) + handler = NewCapNProtoHandler(log.NewNopLogger(), writer) + srv = NewCapNProtoServer(listener, handler, log.NewNopLogger()) + ) + go func() { + _ = srv.ListenAndServe() + }() + defer srv.Shutdown() + + for i := 0; i < 1000; i++ { + client := writecapnp.NewRemoteWriteClient(listener, log.NewLogfmtLogger(os.Stdout)) + _, err := client.RemoteWrite(context.Background(), &storepb.WriteRequest{ + Tenant: "default", + }) + require.NoError(t, err) + require.NoError(t, client.Close()) + } + require.NoError(t, listener.Close()) +} + +func TestCapNProtoServer_MultipleConcurrentClients(t *testing.T) { + t.Parallel() + + var ( + writer = NewCapNProtoWriter( + log.NewNopLogger(), + newFakeTenantAppendable( + &fakeAppendable{appender: newFakeAppender(nil, nil, nil)}), + &CapNProtoWriterOptions{}, + ) + listener = bufconn.Listen(1024) + handler = NewCapNProtoHandler(log.NewNopLogger(), writer) + srv = NewCapNProtoServer(listener, handler, log.NewNopLogger()) + ) + go func() { + _ = srv.ListenAndServe() + }() + defer srv.Shutdown() + + for i := 0; i < 1000; i++ { + client := writecapnp.NewRemoteWriteClient(listener, log.NewLogfmtLogger(os.Stdout)) + _, err := client.RemoteWrite(context.Background(), &storepb.WriteRequest{ + Tenant: "default", + }) + require.NoError(t, err) + defer func() { + require.NoError(t, client.Close()) + }() + } + + require.NoError(t, listener.Close()) +} diff --git a/pkg/receive/capnproto_writer.go b/pkg/receive/capnproto_writer.go new file mode 100644 index 0000000000..e3f1fd6929 --- /dev/null +++ b/pkg/receive/capnproto_writer.go @@ -0,0 +1,169 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package receive + +import ( + "context" + "strings" + + "github.com/thanos-io/thanos/pkg/store/labelpb" + + "github.com/go-kit/log" + "github.com/pkg/errors" + "github.com/prometheus/prometheus/model/exemplar" + "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/storage" + "github.com/prometheus/prometheus/tsdb" + + "github.com/thanos-io/thanos/pkg/receive/writecapnp" +) + +type CapNProtoWriterOptions struct { + TooFarInFutureTimeWindow int64 // Unit: nanoseconds +} + +type CapNProtoWriter struct { + logger log.Logger + multiTSDB TenantStorage + opts *CapNProtoWriterOptions +} + +func NewCapNProtoWriter(logger log.Logger, multiTSDB TenantStorage, opts *CapNProtoWriterOptions) *CapNProtoWriter { + if opts == nil { + opts = &CapNProtoWriterOptions{} + } + return &CapNProtoWriter{ + logger: logger, + multiTSDB: multiTSDB, + opts: opts, + } +} + +func (r *CapNProtoWriter) Write(ctx context.Context, tenantID string, wreq *writecapnp.Request) error { + tLogger := log.With(r.logger, "tenant", tenantID) + + s, err := r.multiTSDB.TenantAppendable(tenantID) + if err != nil { + return errors.Wrap(err, "get tenant appendable") + } + + app, err := s.Appender(ctx) + if err == tsdb.ErrNotReady { + return err + } + if err != nil { + return errors.Wrap(err, "get appender") + } + getRef := app.(storage.GetRef) + var ( + ref storage.SeriesRef + errorTracker = &writeErrorTracker{} + ) + app = &ReceiveAppender{ + tLogger: tLogger, + tooFarInFuture: r.opts.TooFarInFutureTimeWindow, + Appender: app, + } + + var ( + series writecapnp.Series + builder labels.ScratchBuilder + ) + for wreq.Next() { + if err := wreq.At(&series); err != nil { + return errors.Wrap(err, "request.At") + } + + // Check if time series labels are valid. If not, skip the time series + // and report the error. + if err := validateLabels(series.Labels); err != nil { + lset := &labelpb.ZLabelSet{Labels: labelpb.ZLabelsFromPromLabels(series.Labels)} + errorTracker.addLabelsError(err, lset, tLogger) + continue + } + + var lset labels.Labels + // Check if the TSDB has cached reference for those labels. + ref, lset = getRef.GetRef(series.Labels, series.Labels.Hash()) + if ref == 0 { + // NOTE(GiedriusS): do a deep copy because the labels are reused in the capnp message. + // Creation of new series is much rarer compared to adding extra samples + // to an existing series. + builder.Reset() + series.Labels.Range(func(l labels.Label) { + builder.Add(strings.Clone(l.Name), strings.Clone(l.Value)) + }) + lset = builder.Labels() + } + + // Append as many valid samples as possible, but keep track of the errors. + for _, s := range series.Samples { + ref, err = app.Append(ref, lset, s.Timestamp, s.Value) + errorTracker.addSampleError(err, tLogger, lset, s.Timestamp, s.Value) + } + + for _, hp := range series.Histograms { + ref, err = app.AppendHistogram(ref, lset, hp.Timestamp, hp.Histogram, hp.FloatHistogram) + errorTracker.addHistogramError(err, tLogger, lset, hp.Timestamp) + } + + // Current implementation of app.AppendExemplar doesn't create a new series, so it must be already present. + // We drop the exemplars in case the series doesn't exist. + if ref != 0 && len(series.Exemplars) > 0 { + for _, ex := range series.Exemplars { + exLogger := log.With(tLogger, "exemplarLset", ex.Labels) + + if _, err = app.AppendExemplar(ref, lset, exemplar.Exemplar{ + Labels: ex.Labels, + Value: ex.Value, + Ts: ex.Ts, + HasTs: true, + }); err != nil { + errorTracker.addExemplarError(err, exLogger) + } + } + } + } + + errs := errorTracker.collectErrors(tLogger) + if err := app.Commit(); err != nil { + errs.Add(errors.Wrap(err, "commit samples")) + } + return errs.ErrOrNil() +} + +// ValidateLabels validates label names and values (checks for empty +// names and values, out of order labels and duplicate label names) +// Returns appropriate error if validation fails on a label. +func validateLabels(lbls labels.Labels) error { + if lbls.Len() == 0 { + return labelpb.ErrEmptyLabels + } + + var ( + isFirst = true + prevName string + ) + return lbls.Validate(func(l labels.Label) error { + if l.Name == "" || l.Value == "" { + return labelpb.ErrEmptyLabels + } + if isFirst { + prevName = l.Name + isFirst = false + return nil + } + + cmp := strings.Compare(l.Name, prevName) + switch cmp { + case 0: + return labelpb.ErrDuplicateLabels + case -1: + return labelpb.ErrOutOfOrderLabels + } + + prevName = l.Name + return nil + }) +} diff --git a/pkg/receive/capnproto_writer_bench_test.go b/pkg/receive/capnproto_writer_bench_test.go new file mode 100644 index 0000000000..a59c9ef347 --- /dev/null +++ b/pkg/receive/capnproto_writer_bench_test.go @@ -0,0 +1,25 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package receive + +import ( + "strconv" + "testing" + + "github.com/prometheus/prometheus/model/labels" + "github.com/stretchr/testify/require" +) + +func BenchmarkValidateLabels(b *testing.B) { + const numLabels = 20 + builder := labels.NewScratchBuilder(numLabels) + for i := 0; i < numLabels; i++ { + builder.Add("name-"+strconv.Itoa(i), "value-"+strconv.Itoa(i)) + } + builder.Sort() + lbls := builder.Labels() + for i := 0; i < b.N; i++ { + require.NoError(b, validateLabels(lbls)) + } +} diff --git a/pkg/receive/config.go b/pkg/receive/config.go index 6f65f6895d..f453cb2263 100644 --- a/pkg/receive/config.go +++ b/pkg/receive/config.go @@ -8,9 +8,11 @@ import ( "crypto/md5" "encoding/binary" "encoding/json" + "fmt" "io" "os" "path/filepath" + "strings" "time" "github.com/fsnotify/fsnotify" @@ -36,14 +38,44 @@ const ( RouterOnly ReceiverMode = "RouterOnly" IngestorOnly ReceiverMode = "IngestorOnly" RouterIngestor ReceiverMode = "RouterIngestor" + + DefaultCapNProtoPort string = "19391" ) type Endpoint struct { - Address string `json:"address"` - AZ string `json:"az"` + Address string `json:"address"` + CapNProtoAddress string `json:"capnproto_address"` + AZ string `json:"az"` +} + +func (e *Endpoint) String() string { + return fmt.Sprintf("addr: %s, capnp_addr: %s, az: %s", e.Address, e.CapNProtoAddress, e.AZ) +} + +func (e *Endpoint) HasAddress(addr string) bool { + return e.Address == addr || e.CapNProtoAddress == addr } func (e *Endpoint) UnmarshalJSON(data []byte) error { + if err := e.unmarshal(data); err != nil { + return err + } + if e.Address == "" { + return errors.New("endpoint address must be set") + } + + // If the Cap'n proto address is not set, initialize it + // to the existing address using the default cap'n proto server port. + if e.CapNProtoAddress != "" { + return nil + } + if parts := strings.SplitN(e.Address, ":", 2); len(parts) <= 2 { + e.CapNProtoAddress = parts[0] + ":" + DefaultCapNProtoPort + } + return nil +} + +func (e *Endpoint) unmarshal(data []byte) error { // First try to unmarshal as a string. err := json.Unmarshal(data, &e.Address) if err == nil { @@ -53,12 +85,14 @@ func (e *Endpoint) UnmarshalJSON(data []byte) error { // If that fails, try to unmarshal as an endpoint object. type endpointAlias Endpoint var configEndpoint endpointAlias - err = json.Unmarshal(data, &configEndpoint) - if err == nil { - e.Address = configEndpoint.Address - e.AZ = configEndpoint.AZ + if err := json.Unmarshal(data, &configEndpoint); err != nil { + return err } - return err + + e.Address = configEndpoint.Address + e.AZ = configEndpoint.AZ + e.CapNProtoAddress = configEndpoint.CapNProtoAddress + return nil } // HashringConfig represents the configuration for a hashring diff --git a/pkg/receive/config_test.go b/pkg/receive/config_test.go index c1230f327e..5ce78e6514 100644 --- a/pkg/receive/config_test.go +++ b/pkg/receive/config_test.go @@ -14,6 +14,8 @@ import ( ) func TestValidateConfig(t *testing.T) { + t.Parallel() + for _, tc := range []struct { name string cfg interface{} @@ -73,14 +75,51 @@ func TestValidateConfig(t *testing.T) { } func TestUnmarshalEndpointSlice(t *testing.T) { - t.Run("Endpoints as string slice", func(t *testing.T) { - var endpoints []Endpoint - testutil.Ok(t, json.Unmarshal([]byte(`["node-1"]`), &endpoints)) - testutil.Equals(t, endpoints, []Endpoint{{Address: "node-1"}}) - }) - t.Run("Endpoints as endpoints slice", func(t *testing.T) { - var endpoints []Endpoint - testutil.Ok(t, json.Unmarshal([]byte(`[{"address": "node-1", "az": "az-1"}]`), &endpoints)) - testutil.Equals(t, endpoints, []Endpoint{{Address: "node-1", AZ: "az-1"}}) - }) + t.Parallel() + + cases := []struct { + name string + json string + endpoints []Endpoint + expectErr bool + }{ + { + name: "Endpoint with empty address", + json: `[{"az": "az-1"}]`, + endpoints: []Endpoint{{Address: "node-1", CapNProtoAddress: "node-1:19391"}}, + expectErr: true, + }, + { + name: "Endpoints as string slice", + json: `["node-1"]`, + endpoints: []Endpoint{{Address: "node-1", CapNProtoAddress: "node-1:19391"}}, + }, + { + name: "Endpoints as endpoints slice", + json: `[{"address": "node-1", "az": "az-1"}]`, + endpoints: []Endpoint{{Address: "node-1", CapNProtoAddress: "node-1:19391", AZ: "az-1"}}, + }, + { + name: "Endpoints as string slice with port", + json: `["node-1:80"]`, + endpoints: []Endpoint{{Address: "node-1:80", CapNProtoAddress: "node-1:19391"}}, + }, + { + name: "Endpoints as string slice with capnproto port", + json: `[{"address": "node-1", "capnproto_address": "node-1:81"}]`, + endpoints: []Endpoint{{Address: "node-1", CapNProtoAddress: "node-1:81"}}, + }, + } + for _, tcase := range cases { + t.Run(tcase.name, func(t *testing.T) { + var endpoints []Endpoint + err := json.Unmarshal([]byte(tcase.json), &endpoints) + if tcase.expectErr { + testutil.NotOk(t, err) + return + } + testutil.Ok(t, err) + testutil.Equals(t, tcase.endpoints, endpoints) + }) + } } diff --git a/pkg/receive/handler.go b/pkg/receive/handler.go index d6c2596f36..163a29a2e1 100644 --- a/pkg/receive/handler.go +++ b/pkg/receive/handler.go @@ -15,6 +15,7 @@ import ( "net/http" "sort" "strconv" + "strings" "sync" "time" @@ -35,6 +36,7 @@ import ( "github.com/prometheus/prometheus/tsdb" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" + "golang.org/x/exp/slices" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -42,6 +44,7 @@ import ( "github.com/thanos-io/thanos/pkg/api" statusapi "github.com/thanos-io/thanos/pkg/api/status" "github.com/thanos-io/thanos/pkg/logging" + "github.com/thanos-io/thanos/pkg/receive/writecapnp" extpromhttp "github.com/thanos-io/thanos/pkg/extprom/http" "github.com/thanos-io/thanos/pkg/pool" @@ -68,6 +71,13 @@ const ( labelError = "error" ) +type ReplicationProtocol string + +const ( + ProtobufReplication ReplicationProtocol = "protobuf" + CapNProtoReplication ReplicationProtocol = "capnproto" +) + var ( // errConflict is returned whenever an operation fails due to any conflict-type error. errConflict = errors.New("conflict") @@ -105,6 +115,7 @@ type Options struct { TSDBStats TSDBStats Limiter *Limiter AsyncForwardWorkerCount uint + ReplicationProtocol ReplicationProtocol } // Handler serves a Prometheus remote write receiving HTTP endpoint. @@ -154,6 +165,7 @@ func NewHandler(logger log.Logger, o *Options) *Handler { options: o, splitTenantLabelName: o.SplitTenantLabelName, peers: newPeerGroup( + logger, backoff.Backoff{ Factor: 2, Min: 100 * time.Millisecond, @@ -168,6 +180,7 @@ func NewHandler(logger log.Logger, o *Options) *Handler { }, ), workers, + o.ReplicationProtocol, o.DialOpts...), receiverMode: o.ReceiverMode, Limiter: o.Limiter, @@ -305,9 +318,9 @@ func (h *Handler) Hashring(hashring Hashring) { // getSortedStringSliceDiff returns items which are in slice1 but not in slice2. // The returned slice also only contains unique items i.e. it is a set. -func getSortedStringSliceDiff(slice1, slice2 []string) []string { - slice1Items := make(map[string]struct{}, len(slice1)) - slice2Items := make(map[string]struct{}, len(slice2)) +func getSortedStringSliceDiff(slice1, slice2 []Endpoint) []Endpoint { + slice1Items := make(map[Endpoint]struct{}, len(slice1)) + slice2Items := make(map[Endpoint]struct{}, len(slice2)) for _, s1 := range slice1 { slice1Items[s1] = struct{}{} @@ -316,7 +329,7 @@ func getSortedStringSliceDiff(slice1, slice2 []string) []string { slice2Items[s2] = struct{}{} } - var difference = make([]string, 0) + var difference = make([]Endpoint, 0) for s1 := range slice1Items { _, s2Contains := slice2Items[s1] if s2Contains { @@ -324,7 +337,9 @@ func getSortedStringSliceDiff(slice1, slice2 []string) []string { } difference = append(difference, s1) } - sort.Strings(difference) + slices.SortFunc(difference, func(a, b Endpoint) int { + return strings.Compare(a.String(), b.String()) + }) return difference } @@ -399,6 +414,7 @@ func (h *Handler) getStats(r *http.Request, statsByLabelName string) ([]statusap // Close stops the Handler. func (h *Handler) Close() { + _ = h.peers.Close() runutil.CloseWithLogOnErr(h.logger, h.httpSrv, "receive HTTP server") } @@ -435,7 +451,7 @@ type replica struct { // endpointReplica is a pair of a receive endpoint and a write request replica. type endpointReplica struct { - endpoint string + endpoint Endpoint replica uint64 } @@ -681,31 +697,40 @@ type remoteWriteParams struct { alreadyReplicated bool } -func (h *Handler) gatherWriteStats(localWrites map[endpointReplica]map[string]trackedSeries) tenantRequestStats { +func (h *Handler) gatherWriteStats(rf int, writes ...map[endpointReplica]map[string]trackedSeries) tenantRequestStats { var stats tenantRequestStats = make(tenantRequestStats) - for er := range localWrites { - for tenant, series := range localWrites[er] { - samples := 0 + for _, write := range writes { + for er := range write { + for tenant, series := range write[er] { + samples := 0 - for _, ts := range series.timeSeries { - samples += len(ts.Samples) - } + for _, ts := range series.timeSeries { + samples += len(ts.Samples) + } - if st, ok := stats[tenant]; ok { - st.timeseries += len(series.timeSeries) - st.totalSamples += samples + if st, ok := stats[tenant]; ok { + st.timeseries += len(series.timeSeries) + st.totalSamples += samples - stats[tenant] = st - } else { - stats[tenant] = requestStats{ - timeseries: len(series.timeSeries), - totalSamples: samples, + stats[tenant] = st + } else { + stats[tenant] = requestStats{ + timeseries: len(series.timeSeries), + totalSamples: samples, + } } } } } + // adjust counters by the replication factor + for tenant, st := range stats { + st.timeseries /= rf + st.totalSamples /= rf + stats[tenant] = st + } + return stats } @@ -736,7 +761,7 @@ func (h *Handler) fanoutForward(ctx context.Context, params remoteWriteParams) ( return stats, err } - stats = h.gatherWriteStats(localWrites) + stats = h.gatherWriteStats(len(params.replicas), localWrites, remoteWrites) // Prepare a buffered channel to receive the responses from the local and remote writes. Remote writes will all go // asynchronously and with this capacity we will never block on writing to the channel. @@ -843,7 +868,7 @@ func (h *Handler) distributeTimeseriesToReplicas( } endpointReplica := endpointReplica{endpoint: endpoint, replica: rn} var writeDestination = remoteWrites - if endpoint == h.options.Endpoint { + if endpoint.HasAddress(h.options.Endpoint) { writeDestination = localWrites } writeableSeries, ok := writeDestination[endpointReplica] @@ -922,9 +947,7 @@ func (h *Handler) sendLocalWrite( } for tenant, series := range tenantSeriesMapping { - err := h.writer.Write(tracingCtx, tenant, &prompb.WriteRequest{ - Timeseries: series, - }) + err := h.writer.Write(tracingCtx, tenant, series) if err != nil { span.SetTag("error", true) span.SetTag("error.msg", err.Error()) @@ -936,7 +959,7 @@ func (h *Handler) sendLocalWrite( } -// sendRemoteWrite sends a write request to the remote node. It takes care of checking wether the endpoint is up or not +// sendRemoteWrite sends a write request to the remote node. It takes care of checking whether the endpoint is up or not // in the peerGroup, correctly marking them as up or down when appropriate. // The responses are sent to the responses channel. func (h *Handler) sendRemoteWrite( @@ -988,6 +1011,13 @@ func (h *Handler) sendRemoteWrite( // writeQuorum returns minimum number of replicas that has to confirm write success before claiming replication success. func (h *Handler) writeQuorum() int { + // NOTE(GiedriusS): this is here because otherwise RF=2 doesn't make sense as all writes + // would need to succeed all the time. Another way to think about it is when migrating + // from a Sidecar based setup with 2 Prometheus nodes to a Receiver setup, we want to + // keep the same guarantees. + if h.options.ReplicationFactor == 2 { + return 1 + } return int((h.options.ReplicationFactor / 2) + 1) } @@ -1285,44 +1315,75 @@ func newReplicationErrors(threshold, numErrors int) []*replicationErrors { return errs } -func newPeerWorker(cc *grpc.ClientConn, forwardDelay prometheus.Histogram, asyncWorkerCount uint) *peerWorker { +func newPeerWorker(client peerClient, forwardDelay prometheus.Histogram, asyncWorkerCount uint) *peerWorker { return &peerWorker{ - cc: cc, + client: client, wp: pool.NewWorkerPool(asyncWorkerCount), forwardDelay: forwardDelay, } } func (pw *peerWorker) RemoteWrite(ctx context.Context, in *storepb.WriteRequest, opts ...grpc.CallOption) (*storepb.WriteResponse, error) { - return storepb.NewWriteableStoreClient(pw.cc).RemoteWrite(ctx, in) + return pw.client.RemoteWrite(ctx, in) +} + +type peerClient interface { + storepb.WriteableStoreClient + io.Closer +} + +type protobufPeer struct { + storepb.WriteableStoreClient + conn *grpc.ClientConn +} + +func newProtobufPeer(conn *grpc.ClientConn) *protobufPeer { + return &protobufPeer{ + WriteableStoreClient: storepb.NewWriteableStoreClient(conn), + conn: conn, + } +} + +func (p protobufPeer) Close() error { + return p.conn.Close() } type peerWorker struct { - cc *grpc.ClientConn - wp pool.WorkerPool + client peerClient + wp pool.WorkerPool forwardDelay prometheus.Histogram } -func newPeerGroup(backoff backoff.Backoff, forwardDelay prometheus.Histogram, asyncForwardWorkersCount uint, dialOpts ...grpc.DialOption) peersContainer { +func newPeerGroup( + logger log.Logger, + backoff backoff.Backoff, + forwardDelay prometheus.Histogram, + asyncForwardWorkersCount uint, + replicationProtocol ReplicationProtocol, + dialOpts ...grpc.DialOption, +) *peerGroup { return &peerGroup{ + logger: logger, dialOpts: dialOpts, - connections: map[string]*peerWorker{}, + connections: map[Endpoint]*peerWorker{}, m: sync.RWMutex{}, - dialer: grpc.DialContext, - peerStates: make(map[string]*retryState), + dialer: grpc.NewClient, + peerStates: make(map[Endpoint]*retryState), expBackoff: backoff, forwardDelay: forwardDelay, asyncForwardWorkersCount: asyncForwardWorkersCount, + replicationProtocol: replicationProtocol, } } type peersContainer interface { - close(string) error - getConnection(context.Context, string) (WriteableStoreAsyncClient, error) - markPeerUnavailable(string) - markPeerAvailable(string) + close(Endpoint) error + getConnection(context.Context, Endpoint) (WriteableStoreAsyncClient, error) + markPeerUnavailable(Endpoint) + markPeerAvailable(Endpoint) reset() + io.Closer } func (p *peerWorker) RemoteWriteAsync(ctx context.Context, req *storepb.WriteRequest, er endpointReplica, seriesIDs []int, responseWriter chan writeResponse, cb func(error)) { @@ -1331,7 +1392,7 @@ func (p *peerWorker) RemoteWriteAsync(ctx context.Context, req *storepb.WriteReq p.forwardDelay.Observe(time.Since(now).Seconds()) tracing.DoInSpan(ctx, "receive_forward", func(ctx context.Context) { - _, err := storepb.NewWriteableStoreClient(p.cc).RemoteWrite(ctx, req) + _, err := p.client.RemoteWrite(ctx, req) responseWriter <- newWriteResponse( seriesIDs, errors.Wrapf(err, "forwarding request to endpoint %v", er.endpoint), @@ -1351,47 +1412,56 @@ func (p *peerWorker) RemoteWriteAsync(ctx context.Context, req *storepb.WriteReq } type peerGroup struct { + logger log.Logger dialOpts []grpc.DialOption - connections map[string]*peerWorker - peerStates map[string]*retryState + connections map[Endpoint]*peerWorker + peerStates map[Endpoint]*retryState expBackoff backoff.Backoff forwardDelay prometheus.Histogram asyncForwardWorkersCount uint + replicationProtocol ReplicationProtocol m sync.RWMutex // dialer is used for testing. - dialer func(ctx context.Context, target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) + dialer func(target string, opts ...grpc.DialOption) (conn *grpc.ClientConn, err error) +} + +func (p *peerGroup) Close() error { + for _, c := range p.connections { + c.wp.Close() + } + return nil } -func (p *peerGroup) close(addr string) error { +func (p *peerGroup) close(endpoint Endpoint) error { p.m.Lock() defer p.m.Unlock() - c, ok := p.connections[addr] + c, ok := p.connections[endpoint] if !ok { // NOTE(GiedriusS): this could be valid case when the connection // was never established. return nil } - p.connections[addr].wp.Close() - delete(p.connections, addr) - if err := c.cc.Close(); err != nil { - return fmt.Errorf("closing connection for %s", addr) + p.connections[endpoint].wp.Close() + delete(p.connections, endpoint) + if err := c.client.Close(); err != nil { + return fmt.Errorf("closing connection for %s", endpoint) } return nil } -func (p *peerGroup) getConnection(ctx context.Context, addr string) (WriteableStoreAsyncClient, error) { - if !p.isPeerUp(addr) { +func (p *peerGroup) getConnection(ctx context.Context, endpoint Endpoint) (WriteableStoreAsyncClient, error) { + if !p.isPeerUp(endpoint) { return nil, errUnavailable } // use a RLock first to prevent blocking if we don't need to. p.m.RLock() - c, ok := p.connections[addr] + c, ok := p.connections[endpoint] p.m.RUnlock() if ok { return c, nil @@ -1400,29 +1470,40 @@ func (p *peerGroup) getConnection(ctx context.Context, addr string) (WriteableSt p.m.Lock() defer p.m.Unlock() // Make sure that another caller hasn't created the connection since obtaining the write lock. - c, ok = p.connections[addr] + c, ok = p.connections[endpoint] if ok { return c, nil } - conn, err := p.dialer(ctx, addr, p.dialOpts...) - if err != nil { - p.markPeerUnavailableUnlocked(addr) - dialError := errors.Wrap(err, "failed to dial peer") - return nil, errors.Wrap(dialError, errUnavailable.Error()) + + var client peerClient + switch p.replicationProtocol { + case CapNProtoReplication: + client = writecapnp.NewRemoteWriteClient(writecapnp.NewTCPDialer(endpoint.CapNProtoAddress), p.logger) + + case ProtobufReplication: + conn, err := p.dialer(endpoint.Address, p.dialOpts...) + if err != nil { + p.markPeerUnavailableUnlocked(endpoint) + dialError := errors.Wrap(err, "failed to dial peer") + return nil, errors.Wrap(dialError, errUnavailable.Error()) + } + client = newProtobufPeer(conn) + default: + return nil, errors.Errorf("unknown replication protocol %v", p.replicationProtocol) } - p.connections[addr] = newPeerWorker(conn, p.forwardDelay, p.asyncForwardWorkersCount) - return p.connections[addr], nil + p.connections[endpoint] = newPeerWorker(client, p.forwardDelay, p.asyncForwardWorkersCount) + return p.connections[endpoint], nil } -func (p *peerGroup) markPeerUnavailable(addr string) { +func (p *peerGroup) markPeerUnavailable(addr Endpoint) { p.m.Lock() defer p.m.Unlock() p.markPeerUnavailableUnlocked(addr) } -func (p *peerGroup) markPeerUnavailableUnlocked(addr string) { +func (p *peerGroup) markPeerUnavailableUnlocked(addr Endpoint) { state, ok := p.peerStates[addr] if !ok { state = &retryState{attempt: -1} @@ -1432,13 +1513,13 @@ func (p *peerGroup) markPeerUnavailableUnlocked(addr string) { p.peerStates[addr] = state } -func (p *peerGroup) markPeerAvailable(addr string) { +func (p *peerGroup) markPeerAvailable(addr Endpoint) { p.m.Lock() defer p.m.Unlock() delete(p.peerStates, addr) } -func (p *peerGroup) isPeerUp(addr string) bool { +func (p *peerGroup) isPeerUp(addr Endpoint) bool { p.m.RLock() defer p.m.RUnlock() state, ok := p.peerStates[addr] @@ -1450,5 +1531,5 @@ func (p *peerGroup) isPeerUp(addr string) bool { func (p *peerGroup) reset() { p.expBackoff.Reset() - p.peerStates = make(map[string]*retryState) + p.peerStates = make(map[Endpoint]*retryState) } diff --git a/pkg/receive/handler_test.go b/pkg/receive/handler_test.go index 4f81a3d1ca..408e0869fb 100644 --- a/pkg/receive/handler_test.go +++ b/pkg/receive/handler_test.go @@ -22,10 +22,12 @@ import ( "testing" "time" - "google.golang.org/grpc" "gopkg.in/yaml.v3" + goerrors "errors" + "github.com/alecthomas/units" + "github.com/efficientgo/core/testutil" "github.com/go-kit/log" "github.com/gogo/protobuf/proto" "github.com/golang/snappy" @@ -40,12 +42,13 @@ import ( "github.com/prometheus/prometheus/storage" "github.com/prometheus/prometheus/tsdb" "github.com/stretchr/testify/require" - - "github.com/efficientgo/core/testutil" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" "github.com/thanos-io/thanos/pkg/block/metadata" "github.com/thanos-io/thanos/pkg/extkingpin" "github.com/thanos-io/thanos/pkg/logging" + "github.com/thanos-io/thanos/pkg/receive/writecapnp" "github.com/thanos-io/thanos/pkg/runutil" "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb" @@ -169,51 +172,68 @@ func (f *fakeAppender) AppendCTZeroSample(ref storage.SeriesRef, l labels.Labels } type fakePeersGroup struct { - clients map[string]WriteableStoreAsyncClient + clients map[Endpoint]*peerWorker + + closeCalled map[Endpoint]bool +} - closeCalled map[string]bool +func (g *fakePeersGroup) Close() error { + for _, c := range g.clients { + c.wp.Close() + } + return nil } -func (g *fakePeersGroup) markPeerUnavailable(s string) { +func (g *fakePeersGroup) markPeerUnavailable(s Endpoint) { } -func (g *fakePeersGroup) markPeerAvailable(s string) { +func (g *fakePeersGroup) markPeerAvailable(s Endpoint) { } func (g *fakePeersGroup) reset() { } -func (g *fakePeersGroup) close(addr string) error { +func (g *fakePeersGroup) close(addr Endpoint) error { if g.closeCalled == nil { - g.closeCalled = map[string]bool{} + g.closeCalled = map[Endpoint]bool{} } g.closeCalled[addr] = true + g.clients[addr].wp.Close() return nil } -func (g *fakePeersGroup) getConnection(_ context.Context, addr string) (WriteableStoreAsyncClient, error) { - c, ok := g.clients[addr] +func (g *fakePeersGroup) getConnection(_ context.Context, endpoint Endpoint) (WriteableStoreAsyncClient, error) { + c, ok := g.clients[endpoint] if !ok { - return nil, fmt.Errorf("client %s not found", addr) + return nil, fmt.Errorf("client %s not found", endpoint) } return c, nil } var _ = (peersContainer)(&fakePeersGroup{}) -func newTestHandlerHashring(appendables []*fakeAppendable, replicationFactor uint64, hashringAlgo HashringAlgorithm) ([]*Handler, Hashring, error) { +func newTestHandlerHashring( + appendables []*fakeAppendable, + replicationFactor uint64, + hashringAlgo HashringAlgorithm, + capnpReplication bool, +) ([]*Handler, Hashring, func() error, error) { var ( cfg = []HashringConfig{{Hashring: "test"}} handlers []*Handler wOpts = &WriterOptions{} ) fakePeers := &fakePeersGroup{ - clients: map[string]WriteableStoreAsyncClient{}, + clients: map[Endpoint]*peerWorker{}, } - ag := addrGen{} - limiter, _ := NewLimiter(NewNopConfig(), nil, RouterIngestor, log.NewNopLogger(), 1*time.Second) - logger := logging.NewLogger("debug", "logfmt", "receive_test") + var ( + closers = make([]func() error, 0) + + ag = addrGen{} + logger = logging.NewLogger("debug", "logfmt", "receive_test") + limiter, _ = NewLimiter(NewNopConfig(), nil, RouterIngestor, log.NewNopLogger(), 1*time.Second) + ) for i := range appendables { h := NewHandler(logger, &Options{ TenantHeader: tenancy.DefaultTenantHeader, @@ -224,11 +244,30 @@ func newTestHandlerHashring(appendables []*fakeAppendable, replicationFactor uin Limiter: limiter, }) handlers = append(handlers, h) - addr := ag.newAddr() h.peers = fakePeers - fakePeers.clients[addr] = &fakeRemoteWriteGRPCServer{h: h} - h.options.Endpoint = addr - cfg[0].Endpoints = append(cfg[0].Endpoints, Endpoint{Address: h.options.Endpoint}) + endpoint := ag.newEndpoint() + h.options.Endpoint = endpoint.Address + cfg[0].Endpoints = append(cfg[0].Endpoints, endpoint) + + var peer *peerWorker + if capnpReplication { + writer := NewCapNProtoWriter(logger, newFakeTenantAppendable(appendables[i]), nil) + var ( + listener = bufconn.Listen(1024) + handler = NewCapNProtoHandler(log.NewNopLogger(), writer) + ) + srv := NewCapNProtoServer(listener, handler, log.NewNopLogger()) + client := writecapnp.NewRemoteWriteClient(listener, logger) + peer = newPeerWorker(client, prometheus.NewHistogram(prometheus.HistogramOpts{}), 1) + closers = append(closers, func() error { + srv.Shutdown() + return goerrors.Join(listener.Close(), client.Close()) + }) + go func() { _ = srv.ListenAndServe() }() + } else { + peer = newPeerWorker(&fakeRemoteWriteGRPCServer{h: h}, prometheus.NewHistogram(prometheus.HistogramOpts{}), 1) + } + fakePeers.clients[endpoint] = peer } // Use hashmod as default. if hashringAlgo == "" { @@ -237,15 +276,22 @@ func newTestHandlerHashring(appendables []*fakeAppendable, replicationFactor uin hashring, err := NewMultiHashring(hashringAlgo, replicationFactor, cfg) if err != nil { - return nil, nil, err + return nil, nil, nil, err } for _, h := range handlers { h.Hashring(hashring) } - return handlers, hashring, nil + closeFunc := func() error { + errs := make([]error, 0, len(closers)) + for _, closeFunc := range closers { + errs = append(errs, closeFunc()) + } + return goerrors.Join(errs...) + } + return handlers, hashring, closeFunc, nil } -func testReceiveQuorum(t *testing.T, hashringAlgo HashringAlgorithm, withConsistencyDelay bool) { +func testReceiveQuorum(t *testing.T, hashringAlgo HashringAlgorithm, withConsistencyDelay, capnpReplication bool) { appenderErrFn := func() error { return errors.New("failed to get appender") } conflictErrFn := func() error { return storage.ErrOutOfBounds } tooOldSampleErrFn := func() error { return storage.ErrTooOldSample } @@ -613,10 +659,19 @@ func testReceiveQuorum(t *testing.T, hashringAlgo HashringAlgorithm, withConsist }, } { t.Run(tc.name, func(t *testing.T) { - handlers, hashring, err := newTestHandlerHashring(tc.appendables, tc.replicationFactor, hashringAlgo) + handlers, hashring, closeFunc, err := newTestHandlerHashring(tc.appendables, tc.replicationFactor, hashringAlgo, capnpReplication) if err != nil { t.Fatalf("unable to create test handler: %v", err) } + defer func() { + testutil.Ok(t, closeFunc()) + // Wait a few milliseconds for peer workers to process the queue. + time.AfterFunc(50*time.Millisecond, func() { + for _, h := range handlers { + h.Close() + } + }) + }() tenant := "test" if tc.randomNode { @@ -681,6 +736,7 @@ func testReceiveQuorum(t *testing.T, hashringAlgo HashringAlgorithm, withConsist t.Errorf("handler: %d, labels %q: expected minimum of %d samples, got %d", j, lset.String(), expectedMin, got) } } + } } }) @@ -688,22 +744,48 @@ func testReceiveQuorum(t *testing.T, hashringAlgo HashringAlgorithm, withConsist } func TestReceiveQuorumHashmod(t *testing.T) { - testReceiveQuorum(t, AlgorithmHashmod, false) + t.Parallel() + + for _, capnpReplication := range []bool{false, true} { + t.Run(fmt.Sprintf("capnproto-replication=%t", capnpReplication), func(t *testing.T) { + testReceiveQuorum(t, AlgorithmHashmod, false, capnpReplication) + }) + } } func TestReceiveQuorumKetama(t *testing.T) { - testReceiveQuorum(t, AlgorithmKetama, false) + t.Parallel() + + for _, capnpReplication := range []bool{false, true} { + t.Run(fmt.Sprintf("capnproto-replication=%t", capnpReplication), func(t *testing.T) { + testReceiveQuorum(t, AlgorithmKetama, false, capnpReplication) + }) + } } func TestReceiveWithConsistencyDelayHashmod(t *testing.T) { - testReceiveQuorum(t, AlgorithmHashmod, true) + t.Parallel() + + for _, capnpReplication := range []bool{false, true} { + t.Run(fmt.Sprintf("capnproto-replication=%t", capnpReplication), func(t *testing.T) { + testReceiveQuorum(t, AlgorithmHashmod, true, capnpReplication) + }) + } } func TestReceiveWithConsistencyDelayKetama(t *testing.T) { - testReceiveQuorum(t, AlgorithmKetama, true) + t.Parallel() + + for _, capnpReplication := range []bool{false, true} { + t.Run(fmt.Sprintf("capnproto-replication=%t", capnpReplication), func(t *testing.T) { + testReceiveQuorum(t, AlgorithmKetama, true, capnpReplication) + }) + } } func TestReceiveWriteRequestLimits(t *testing.T) { + t.Parallel() + for _, tc := range []struct { name string status int @@ -755,10 +837,20 @@ func TestReceiveWriteRequestLimits(t *testing.T) { appender: newFakeAppender(nil, nil, nil), }, } - handlers, _, err := newTestHandlerHashring(appendables, 3, AlgorithmHashmod) + handlers, _, closeFunc, err := newTestHandlerHashring(appendables, 3, AlgorithmHashmod, false) if err != nil { t.Fatalf("unable to create test handler: %v", err) } + defer func() { + testutil.Ok(t, closeFunc()) + // Wait a few milliseconds for peer workers to process the queue. + time.AfterFunc(50*time.Millisecond, func() { + for _, h := range handlers { + h.Close() + } + }) + }() + handler := handlers[0] tenant := "test" @@ -820,7 +912,7 @@ func endpointHit(t *testing.T, h Hashring, rf uint64, endpoint, tenant string, t if err != nil { t.Fatalf("got unexpected error querying hashring: %v", err) } - if e == endpoint { + if e.HasAddress(endpoint) { return true } } @@ -864,9 +956,13 @@ func makeRequest(h *Handler, tenant string, wreq *prompb.WriteRequest) (*httptes type addrGen struct{ n int } -func (a *addrGen) newAddr() string { +func (a *addrGen) newEndpoint() Endpoint { a.n++ - return fmt.Sprintf("http://node-%d:%d", a.n, 12345+a.n) + addr := fmt.Sprintf("http://node-%d:%d", a.n, 12345+a.n) + return Endpoint{ + Address: addr, + CapNProtoAddress: addr, + } } type fakeRemoteWriteGRPCServer struct { @@ -887,11 +983,15 @@ func (f *fakeRemoteWriteGRPCServer) RemoteWriteAsync(ctx context.Context, in *st cb(err) } +func (f *fakeRemoteWriteGRPCServer) Close() error { return nil } + func BenchmarkHandlerReceiveHTTP(b *testing.B) { benchmarkHandlerMultiTSDBReceiveRemoteWrite(testutil.NewTB(b)) } func TestHandlerReceiveHTTP(t *testing.T) { + t.Parallel() + benchmarkHandlerMultiTSDBReceiveRemoteWrite(testutil.NewTB(t)) } @@ -977,10 +1077,13 @@ func makeSeriesWithValues(numSeries int) []prompb.TimeSeries { func benchmarkHandlerMultiTSDBReceiveRemoteWrite(b testutil.TB) { dir := b.TempDir() - handlers, _, err := newTestHandlerHashring([]*fakeAppendable{nil}, 1, AlgorithmHashmod) + handlers, _, closeFunc, err := newTestHandlerHashring([]*fakeAppendable{nil}, 1, AlgorithmHashmod, false) if err != nil { b.Fatalf("unable to create test handler: %v", err) } + defer func() { + testutil.Ok(b, closeFunc()) + }() handler := handlers[0] reg := prometheus.NewRegistry() @@ -1157,6 +1260,8 @@ func Heap(dir string) (err error) { } func TestIsTenantValid(t *testing.T) { + t.Parallel() + for _, tcase := range []struct { name string tenant string @@ -1204,6 +1309,8 @@ func TestIsTenantValid(t *testing.T) { } func TestRelabel(t *testing.T) { + t.Parallel() + for _, tcase := range []struct { name string relabel []*relabel.Config @@ -1573,6 +1680,8 @@ func TestRelabel(t *testing.T) { } func TestGetStatsLimitParameter(t *testing.T) { + t.Parallel() + t.Run("invalid limit parameter, not integer", func(t *testing.T) { r, err := http.NewRequest(http.MethodGet, "http://0:0", nil) testutil.Ok(t, err) @@ -1619,13 +1728,9 @@ func TestGetStatsLimitParameter(t *testing.T) { }) } -func TestSortedSliceDiff(t *testing.T) { - testutil.Equals(t, []string{"a"}, getSortedStringSliceDiff([]string{"a", "a", "foo"}, []string{"b", "b", "foo"})) - testutil.Equals(t, []string{}, getSortedStringSliceDiff([]string{}, []string{"b", "b", "foo"})) - testutil.Equals(t, []string{}, getSortedStringSliceDiff([]string{}, []string{})) -} - func TestHashringChangeCallsClose(t *testing.T) { + t.Parallel() + appendables := []*fakeAppendable{ { appender: newFakeAppender(nil, nil, nil), @@ -1637,13 +1742,15 @@ func TestHashringChangeCallsClose(t *testing.T) { appender: newFakeAppender(nil, nil, nil), }, } - allHandlers, _, err := newTestHandlerHashring(appendables, 3, AlgorithmHashmod) + allHandlers, _, closeFunc, err := newTestHandlerHashring(appendables, 3, AlgorithmHashmod, false) testutil.Ok(t, err) + testutil.Ok(t, closeFunc()) appendables = appendables[1:] - _, smallHashring, err := newTestHandlerHashring(appendables, 2, AlgorithmHashmod) + _, smallHashring, closeFunc, err := newTestHandlerHashring(appendables, 2, AlgorithmHashmod, false) testutil.Ok(t, err) + testutil.Ok(t, closeFunc()) allHandlers[0].Hashring(smallHashring) @@ -1652,6 +1759,8 @@ func TestHashringChangeCallsClose(t *testing.T) { } func TestHandlerEarlyStop(t *testing.T) { + t.Parallel() + h := NewHandler(nil, &Options{}) h.Close() @@ -1666,7 +1775,7 @@ type hashringSeenTenants struct { seenTenants map[string]struct{} } -func (h *hashringSeenTenants) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (string, error) { +func (h *hashringSeenTenants) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (Endpoint, error) { if h.seenTenants == nil { h.seenTenants = map[string]struct{}{} } @@ -1675,16 +1784,15 @@ func (h *hashringSeenTenants) GetN(tenant string, ts *prompb.TimeSeries, n uint6 } func TestDistributeSeries(t *testing.T) { + t.Parallel() + const tenantIDLabelName = "thanos_tenant_id" h := NewHandler(nil, &Options{ SplitTenantLabelName: tenantIDLabelName, }) - hashring, err := newSimpleHashring([]Endpoint{ - { - Address: "http://localhost:9090", - }, - }) + endpoint := Endpoint{Address: "http://localhost:9090", CapNProtoAddress: "http://localhost:19391"} + hashring, err := newSimpleHashring([]Endpoint{endpoint}) require.NoError(t, err) hr := &hashringSeenTenants{Hashring: hashring} h.Hashring(hr) @@ -1703,15 +1811,18 @@ func TestDistributeSeries(t *testing.T) { ) require.NoError(t, err) require.Len(t, remote, 1) - require.Len(t, remote[endpointReplica{endpoint: "http://localhost:9090", replica: 0}]["bar"].timeSeries, 1) - require.Len(t, remote[endpointReplica{endpoint: "http://localhost:9090", replica: 0}]["boo"].timeSeries, 1) + require.Len(t, remote[endpointReplica{endpoint: endpoint, replica: 0}]["bar"].timeSeries, 1) + require.Len(t, remote[endpointReplica{endpoint: endpoint, replica: 0}]["boo"].timeSeries, 1) + + require.Equal(t, 1, labelpb.ZLabelsToPromLabels(remote[endpointReplica{endpoint: endpoint, replica: 0}]["bar"].timeSeries[0].Labels).Len()) + require.Equal(t, 1, labelpb.ZLabelsToPromLabels(remote[endpointReplica{endpoint: endpoint, replica: 0}]["boo"].timeSeries[0].Labels).Len()) - require.Equal(t, 1, labelpb.ZLabelsToPromLabels(remote[endpointReplica{endpoint: "http://localhost:9090", replica: 0}]["bar"].timeSeries[0].Labels).Len()) - require.Equal(t, 1, labelpb.ZLabelsToPromLabels(remote[endpointReplica{endpoint: "http://localhost:9090", replica: 0}]["boo"].timeSeries[0].Labels).Len()) require.Equal(t, map[string]struct{}{"bar": {}, "boo": {}}, hr.seenTenants) } func TestHandlerFlippingHashrings(t *testing.T) { + t.Parallel() + h := NewHandler(log.NewLogfmtLogger(os.Stderr), &Options{}) t.Cleanup(h.Close) diff --git a/pkg/receive/hashring.go b/pkg/receive/hashring.go index cb05f956fb..6f08793486 100644 --- a/pkg/receive/hashring.go +++ b/pkg/receive/hashring.go @@ -9,9 +9,14 @@ import ( "path/filepath" "sort" "strconv" + "strings" "sync" "github.com/cespare/xxhash" + "golang.org/x/exp/slices" + + "github.com/go-kit/log" + "github.com/go-kit/log/level" "github.com/go-kit/log" "github.com/go-kit/log/level" @@ -53,36 +58,56 @@ func (i *insufficientNodesError) Error() string { // It returns the node and any error encountered. type Hashring interface { // Get returns the first node that should handle the given tenant and time series. - Get(tenant string, timeSeries *prompb.TimeSeries) (string, error) + Get(tenant string, timeSeries *prompb.TimeSeries) (Endpoint, error) // GetN returns the nth node that should handle the given tenant and time series. - GetN(tenant string, timeSeries *prompb.TimeSeries, n uint64) (string, error) + GetN(tenant string, timeSeries *prompb.TimeSeries, n uint64) (Endpoint, error) // Nodes returns a sorted slice of nodes that are in this hashring. Addresses could be duplicated // if, for example, the same address is used for multiple tenants in the multi-hashring. - Nodes() []string + Nodes() []Endpoint } // SingleNodeHashring always returns the same node. type SingleNodeHashring string // Get implements the Hashring interface. -func (s SingleNodeHashring) Get(tenant string, ts *prompb.TimeSeries) (string, error) { +func (s SingleNodeHashring) Get(tenant string, ts *prompb.TimeSeries) (Endpoint, error) { return s.GetN(tenant, ts, 0) } -func (s SingleNodeHashring) Nodes() []string { - return []string{string(s)} +func (s SingleNodeHashring) Nodes() []Endpoint { + return []Endpoint{{Address: string(s), CapNProtoAddress: string(s)}} } // GetN implements the Hashring interface. -func (s SingleNodeHashring) GetN(_ string, _ *prompb.TimeSeries, n uint64) (string, error) { +func (s SingleNodeHashring) GetN(_ string, _ *prompb.TimeSeries, n uint64) (Endpoint, error) { if n > 0 { - return "", &insufficientNodesError{have: 1, want: n + 1} + return Endpoint{}, &insufficientNodesError{have: 1, want: n + 1} } - return string(s), nil + return Endpoint{ + Address: string(s), + CapNProtoAddress: string(s), + }, nil } // simpleHashring represents a group of nodes handling write requests by hashmoding individual series. -type simpleHashring []string +type simpleHashring []Endpoint + +func newSimpleHashring(endpoints []Endpoint) (Hashring, error) { + for i := range endpoints { + if endpoints[i].AZ != "" { + return nil, errors.New("Hashmod algorithm does not support AZ aware hashring configuration. Either use Ketama or remove AZ configuration.") + } + } + slices.SortFunc(endpoints, func(a, b Endpoint) int { + return strings.Compare(a.Address, b.Address) + }) + + return simpleHashring(endpoints), nil +} + +func (s simpleHashring) Nodes() []Endpoint { + return s +} func newSimpleHashring(endpoints []Endpoint) (Hashring, error) { addresses := make([]string, len(endpoints)) @@ -102,14 +127,14 @@ func (s simpleHashring) Nodes() []string { } // Get returns a target to handle the given tenant and time series. -func (s simpleHashring) Get(tenant string, ts *prompb.TimeSeries) (string, error) { +func (s simpleHashring) Get(tenant string, ts *prompb.TimeSeries) (Endpoint, error) { return s.GetN(tenant, ts, 0) } // GetN returns the nth target to handle the given tenant and time series. -func (s simpleHashring) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (string, error) { +func (s simpleHashring) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (Endpoint, error) { if n >= uint64(len(s)) { - return "", &insufficientNodesError{have: uint64(len(s)), want: n + 1} + return Endpoint{}, &insufficientNodesError{have: uint64(len(s)), want: n + 1} } return s[(labelpb.HashWithPrefix(tenant, ts.Labels)+n)%uint64(len(s))], nil @@ -148,10 +173,8 @@ func newKetamaHashring(endpoints []Endpoint, sectionsPerNode int, replicationFac availabilityZones := make(map[string]struct{}) ringSections := make(sections, 0, numSections) - nodes := []string{} for endpointIndex, endpoint := range endpoints { availabilityZones[endpoint.AZ] = struct{}{} - nodes = append(nodes, endpoint.Address) for i := 1; i <= sectionsPerNode; i++ { _, _ = hash.Write([]byte(endpoint.Address + ":" + strconv.Itoa(i))) n := §ion{ @@ -166,19 +189,17 @@ func newKetamaHashring(endpoints []Endpoint, sectionsPerNode int, replicationFac } } sort.Sort(ringSections) - sort.Strings(nodes) calculateSectionReplicas(ringSections, replicationFactor, availabilityZones) return &ketamaHashring{ endpoints: endpoints, sections: ringSections, numEndpoints: uint64(len(endpoints)), - nodes: nodes, }, nil } -func (k *ketamaHashring) Nodes() []string { - return k.nodes +func (k *ketamaHashring) Nodes() []Endpoint { + return k.endpoints } func sizeOfLeastOccupiedAZ(azSpread map[string]int64) int64 { @@ -219,13 +240,13 @@ func calculateSectionReplicas(ringSections sections, replicationFactor uint64, a } } -func (c ketamaHashring) Get(tenant string, ts *prompb.TimeSeries) (string, error) { +func (c ketamaHashring) Get(tenant string, ts *prompb.TimeSeries) (Endpoint, error) { return c.GetN(tenant, ts, 0) } -func (c ketamaHashring) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (string, error) { +func (c ketamaHashring) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (Endpoint, error) { if n >= c.numEndpoints { - return "", &insufficientNodesError{have: c.numEndpoints, want: n + 1} + return Endpoint{}, &insufficientNodesError{have: c.numEndpoints, want: n + 1} } v := labelpb.HashWithPrefix(tenant, ts.Labels) @@ -257,16 +278,16 @@ type multiHashring struct { // and read from. mu sync.RWMutex - nodes []string + nodes []Endpoint } // Get returns a target to handle the given tenant and time series. -func (m *multiHashring) Get(tenant string, ts *prompb.TimeSeries) (string, error) { +func (m *multiHashring) Get(tenant string, ts *prompb.TimeSeries) (Endpoint, error) { return m.GetN(tenant, ts, 0) } // GetN returns the nth target to handle the given tenant and time series. -func (m *multiHashring) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (string, error) { +func (m *multiHashring) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (Endpoint, error) { m.mu.RLock() h, ok := m.cache[tenant] m.mu.RUnlock() @@ -292,7 +313,7 @@ func (m *multiHashring) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (st case TenantMatcherGlob: matches, err := filepath.Match(tenantPattern, tenant) if err != nil { - return "", fmt.Errorf("error matching tenant pattern %s (tenant %s): %w", tenantPattern, tenant, err) + return Endpoint{}, fmt.Errorf("error matching tenant pattern %s (tenant %s): %w", tenantPattern, tenant, err) } found = matches case TenantMatcherTypeExact: @@ -314,7 +335,11 @@ func (m *multiHashring) GetN(tenant string, ts *prompb.TimeSeries, n uint64) (st return m.hashrings[i].GetN(tenant, ts, n) } } - return "", errors.New("no matching hashring to handle tenant") + return Endpoint{}, errors.New("no matching hashring to handle tenant") +} + +func (m *multiHashring) Nodes() []Endpoint { + return m.nodes } func (m *multiHashring) Nodes() []string { @@ -352,7 +377,9 @@ func NewMultiHashring(algorithm HashringAlgorithm, replicationFactor uint64, cfg } m.tenantSets = append(m.tenantSets, t) } - sort.Strings(m.nodes) + slices.SortFunc(m.nodes, func(a, b Endpoint) int { + return strings.Compare(a.Address, b.Address) + }) return m, nil } diff --git a/pkg/receive/hashring_test.go b/pkg/receive/hashring_test.go index ad6d4db855..0cb2ae4bbe 100644 --- a/pkg/receive/hashring_test.go +++ b/pkg/receive/hashring_test.go @@ -19,6 +19,8 @@ import ( ) func TestHashringGet(t *testing.T) { + t.Parallel() + ts := &prompb.TimeSeries{ Labels: []labelpb.ZLabel{ { @@ -148,7 +150,7 @@ func TestHashringGet(t *testing.T) { t.Errorf("case %q: got unexpected error: %v", tc.name, err) continue } - if _, ok := tc.nodes[h]; !ok { + if _, ok := tc.nodes[h.Address]; !ok { t.Errorf("case %q: got unexpected node %q", tc.name, h) } continue @@ -160,6 +162,8 @@ func TestHashringGet(t *testing.T) { } func TestKetamaHashringGet(t *testing.T) { + t.Parallel() + baseTS := &prompb.TimeSeries{ Labels: []labelpb.ZLabel{ { @@ -236,17 +240,21 @@ func TestKetamaHashringGet(t *testing.T) { result, err := hashRing.GetN("tenant", test.ts, test.n) require.NoError(t, err) - require.Equal(t, test.expectedNode, result) + require.Equal(t, test.expectedNode, result.Address) }) } } func TestKetamaHashringBadConfigIsRejected(t *testing.T) { + t.Parallel() + _, err := newKetamaHashring([]Endpoint{{Address: "node-1"}}, 1, 2) require.Error(t, err) } func TestKetamaHashringConsistency(t *testing.T) { + t.Parallel() + series := makeSeries() ringA := []Endpoint{{Address: "node-1"}, {Address: "node-2"}, {Address: "node-3"}} @@ -267,6 +275,8 @@ func TestKetamaHashringConsistency(t *testing.T) { } func TestKetamaHashringIncreaseAtEnd(t *testing.T) { + t.Parallel() + series := makeSeries() initialRing := []Endpoint{{Address: "node-1"}, {Address: "node-2"}, {Address: "node-3"}} @@ -287,6 +297,8 @@ func TestKetamaHashringIncreaseAtEnd(t *testing.T) { } func TestKetamaHashringIncreaseInMiddle(t *testing.T) { + t.Parallel() + series := makeSeries() initialRing := []Endpoint{{Address: "node-1"}, {Address: "node-3"}} @@ -307,6 +319,8 @@ func TestKetamaHashringIncreaseInMiddle(t *testing.T) { } func TestKetamaHashringReplicationConsistency(t *testing.T) { + t.Parallel() + series := makeSeries() initialRing := []Endpoint{{Address: "node-1"}, {Address: "node-4"}, {Address: "node-5"}} @@ -327,6 +341,8 @@ func TestKetamaHashringReplicationConsistency(t *testing.T) { } func TestKetamaHashringReplicationConsistencyWithAZs(t *testing.T) { + t.Parallel() + for _, tt := range []struct { initialRing []Endpoint resizedRing []Endpoint @@ -379,6 +395,8 @@ func TestKetamaHashringReplicationConsistencyWithAZs(t *testing.T) { } func TestKetamaHashringEvenAZSpread(t *testing.T) { + t.Parallel() + tenant := "default-tenant" ts := &prompb.TimeSeries{ Labels: labelpb.ZLabelsFromPromLabels(labels.FromStrings("foo", "bar")), @@ -459,7 +477,7 @@ func TestKetamaHashringEvenAZSpread(t *testing.T) { testutil.Ok(t, err) for _, n := range tt.nodes { - if !strings.HasPrefix(n.Address, r) { + if !strings.HasPrefix(n.Address, r.Address) { continue } azSpread[n.AZ]++ @@ -482,6 +500,8 @@ func TestKetamaHashringEvenAZSpread(t *testing.T) { } func TestKetamaHashringEvenNodeSpread(t *testing.T) { + t.Parallel() + tenant := "default-tenant" for _, tt := range []struct { @@ -561,7 +581,7 @@ func TestKetamaHashringEvenNodeSpread(t *testing.T) { r, err := hashRing.GetN(tenant, ts, uint64(j)) testutil.Ok(t, err) - nodeSpread[r]++ + nodeSpread[r.Address]++ } } for _, node := range nodeSpread { @@ -573,6 +593,8 @@ func TestKetamaHashringEvenNodeSpread(t *testing.T) { } func TestInvalidAZHashringCfg(t *testing.T) { + t.Parallel() + for _, tt := range []struct { cfg []HashringConfig replicas uint64 @@ -636,7 +658,7 @@ func assignReplicatedSeries(series []prompb.TimeSeries, nodes []Endpoint, replic if err != nil { return nil, err } - assignments[result] = append(assignments[result], ts) + assignments[result.Address] = append(assignments[result.Address], ts) } } diff --git a/pkg/receive/limiter_config_test.go b/pkg/receive/limiter_config_test.go index 3b6c15876b..a421612e0c 100644 --- a/pkg/receive/limiter_config_test.go +++ b/pkg/receive/limiter_config_test.go @@ -13,6 +13,8 @@ import ( ) func TestParseLimiterConfig(t *testing.T) { + t.Parallel() + tests := []struct { name string configFileName string diff --git a/pkg/receive/limiter_test.go b/pkg/receive/limiter_test.go index 960e567a17..4bb3113aad 100644 --- a/pkg/receive/limiter_test.go +++ b/pkg/receive/limiter_test.go @@ -17,6 +17,8 @@ import ( ) func TestLimiter_StartConfigReloader(t *testing.T) { + t.Parallel() + origLimitsFile, err := os.ReadFile(path.Join("testdata", "limits_config", "good_limits.yaml")) testutil.Ok(t, err) copyLimitsFile := path.Join(t.TempDir(), "limits.yaml") @@ -55,6 +57,8 @@ func (e emptyPathFile) Path() string { } func TestLimiter_CanReload(t *testing.T) { + t.Parallel() + validLimitsPath, err := extkingpin.NewStaticPathContent( path.Join("testdata", "limits_config", "good_limits.yaml"), ) diff --git a/pkg/receive/multitsdb.go b/pkg/receive/multitsdb.go index 5ea7bfcc5b..9c9954d1bd 100644 --- a/pkg/receive/multitsdb.go +++ b/pkg/receive/multitsdb.go @@ -20,6 +20,7 @@ import ( "go.uber.org/atomic" "golang.org/x/exp/slices" "golang.org/x/sync/errgroup" + "google.golang.org/grpc" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/prometheus/model/labels" @@ -27,6 +28,7 @@ import ( "github.com/prometheus/prometheus/tsdb" "github.com/thanos-io/objstore" + "github.com/thanos-io/thanos/pkg/api/status" "github.com/thanos-io/thanos/pkg/block/metadata" "github.com/thanos-io/thanos/pkg/component" @@ -59,6 +61,21 @@ type MultiTSDB struct { allowOutOfOrderUpload bool hashFunc metadata.HashFunc hashringConfigs []HashringConfig + + tsdbClients []store.Client + exemplarClients map[string]*exemplars.TSDB + + metricNameFilterEnabled bool +} + +// MultiTSDBOption is a functional option for MultiTSDB. +type MultiTSDBOption func(mt *MultiTSDB) + +// WithMetricNameFilterEnabled enables metric name filtering on TSDB clients. +func WithMetricNameFilterEnabled() MultiTSDBOption { + return func(s *MultiTSDB) { + s.metricNameFilterEnabled = true + } } // NewMultiTSDB creates new MultiTSDB. @@ -73,12 +90,13 @@ func NewMultiTSDB( bucket objstore.Bucket, allowOutOfOrderUpload bool, hashFunc metadata.HashFunc, + options ...MultiTSDBOption, ) *MultiTSDB { if l == nil { l = log.NewNopLogger() } - return &MultiTSDB{ + mt := &MultiTSDB{ dataDir: dataDir, logger: log.With(l, "component", "multi-tsdb"), reg: reg, @@ -86,25 +104,93 @@ func NewMultiTSDB( mtx: &sync.RWMutex{}, tenants: map[string]*tenant{}, labels: labels, + tsdbClients: make([]store.Client, 0), + exemplarClients: map[string]*exemplars.TSDB{}, tenantLabelName: tenantLabelName, bucket: bucket, allowOutOfOrderUpload: allowOutOfOrderUpload, hashFunc: hashFunc, } + + for _, option := range options { + option(mt) + } + + return mt +} + +// testGetTenant returns the tenant with the given tenantID for testing purposes. +func (t *MultiTSDB) testGetTenant(tenantID string) *tenant { + t.mtx.RLock() + defer t.mtx.RUnlock() + return t.tenants[tenantID] +} + +func (t *MultiTSDB) updateTSDBClients() { + t.tsdbClients = t.tsdbClients[:0] + for _, tenant := range t.tenants { + client := tenant.client() + if client != nil { + t.tsdbClients = append(t.tsdbClients, client) + } + } +} + +func (t *MultiTSDB) addTenantUnlocked(tenantID string, newTenant *tenant) { + t.tenants[tenantID] = newTenant + t.updateTSDBClients() + if newTenant.exemplars() != nil { + t.exemplarClients[tenantID] = newTenant.exemplars() + } +} + +func (t *MultiTSDB) addTenantLocked(tenantID string, newTenant *tenant) { + t.mtx.Lock() + defer t.mtx.Unlock() + t.addTenantUnlocked(tenantID, newTenant) +} + +func (t *MultiTSDB) removeTenantUnlocked(tenantID string) { + delete(t.tenants, tenantID) + delete(t.exemplarClients, tenantID) + t.updateTSDBClients() +} + +func (t *MultiTSDB) removeTenantLocked(tenantID string) { + t.mtx.Lock() + defer t.mtx.Unlock() + t.removeTenantUnlocked(tenantID) } type localClient struct { - storepb.StoreClient store *store.TSDBStore + + client storepb.StoreClient } -func newLocalClient(c storepb.StoreClient, store *store.TSDBStore) *localClient { +func newLocalClient(store *store.TSDBStore) *localClient { return &localClient{ - StoreClient: c, - store: store, + store: store, + client: storepb.ServerAsClient(store), } } +func (l *localClient) Series(ctx context.Context, in *storepb.SeriesRequest, opts ...grpc.CallOption) (storepb.Store_SeriesClient, error) { + return l.client.Series(ctx, in, opts...) +} + +func (l *localClient) LabelNames(ctx context.Context, in *storepb.LabelNamesRequest, opts ...grpc.CallOption) (*storepb.LabelNamesResponse, error) { + return l.store.LabelNames(ctx, in) +} + +func (l *localClient) LabelValues(ctx context.Context, in *storepb.LabelValuesRequest, opts ...grpc.CallOption) (*storepb.LabelValuesResponse, error) { + return l.store.LabelValues(ctx, in) +} + +func (l *localClient) Matches(matchers []*labels.Matcher) bool { + return l.store.Matches(matchers) +} + func (l *localClient) LabelSets() []labels.Labels { return labelpb.ZLabelSetsToPromLabelSets(l.store.LabelSet()...) } @@ -196,23 +282,16 @@ func (t *tenant) readyStorage() *ReadyStorage { return t.readyS } -func (t *tenant) store() *store.TSDBStore { +func (t *tenant) client() store.Client { t.mtx.RLock() defer t.mtx.RUnlock() - return t.storeTSDB -} -func (t *tenant) client(logger log.Logger) store.Client { - t.mtx.RLock() - defer t.mtx.RUnlock() - - tsdbStore := t.store() + tsdbStore := t.storeTSDB if tsdbStore == nil { return nil } - client := storepb.ServerAsClient(store.NewRecoverableStoreServer(logger, tsdbStore)) - return newLocalClient(client, tsdbStore) + return newLocalClient(tsdbStore) } func (t *tenant) exemplars() *exemplars.TSDB { @@ -235,6 +314,9 @@ func (t *tenant) set(storeTSDB *store.TSDBStore, tenantTSDB *tsdb.DB, ship *ship } func (t *tenant) setComponents(storeTSDB *store.TSDBStore, ship *shipper.Shipper, exemplarsTSDB *exemplars.TSDB, tenantTSDB *tsdb.DB) { + if storeTSDB == nil && t.storeTSDB != nil { + t.storeTSDB.Close() + } t.storeTSDB = storeTSDB t.ship = ship t.exemplarsTSDB = exemplarsTSDB @@ -334,6 +416,7 @@ func (t *MultiTSDB) Prune(ctx context.Context) error { if t.tsdbOpts.RetentionDuration == 0 { return nil } + level.Info(t.logger).Log("msg", "Running pruning job") var ( wg sync.WaitGroup @@ -342,7 +425,6 @@ func (t *MultiTSDB) Prune(ctx context.Context) error { prunedTenants []string pmtx sync.Mutex ) - t.mtx.RLock() for tenantID, tenantInstance := range t.tenants { wg.Add(1) @@ -374,7 +456,7 @@ func (t *MultiTSDB) Prune(ctx context.Context) error { } level.Info(t.logger).Log("msg", "Pruned tenant", "tenant", tenantID) - delete(t.tenants, tenantID) + t.removeTenantUnlocked(tenantID) } return merr.Err() @@ -534,33 +616,18 @@ func (t *MultiTSDB) RemoveLockFilesIfAny() error { return merr.Err() } +// TSDBLocalClients should be used as read-only. func (t *MultiTSDB) TSDBLocalClients() []store.Client { t.mtx.RLock() defer t.mtx.RUnlock() - - res := make([]store.Client, 0, len(t.tenants)) - for _, tenant := range t.tenants { - client := tenant.client(t.logger) - if client != nil { - res = append(res, client) - } - } - - return res + return t.tsdbClients } +// TSDBExemplars should be used as read-only. func (t *MultiTSDB) TSDBExemplars() map[string]*exemplars.TSDB { t.mtx.RLock() defer t.mtx.RUnlock() - - res := make(map[string]*exemplars.TSDB, len(t.tenants)) - for k, tenant := range t.tenants { - e := tenant.exemplars() - if e != nil { - res[k] = e - } - } - return res + return t.exemplarClients } func (t *MultiTSDB) TenantStats(limit int, statsByLabelName string, tenantIDs ...string) []status.TenantStats { @@ -619,6 +686,7 @@ func (t *MultiTSDB) startTSDB(logger log.Logger, tenantID string, tenant *tenant level.Info(logger).Log("msg", "opening TSDB") opts := *t.tsdbOpts opts.BlocksToDelete = tenant.blocksToDelete + opts.EnableDelayedCompaction = true tenant.blocksToDeleteFn = tsdb.DefaultBlocksToDelete // NOTE(GiedriusS): always set to false to properly handle OOO samples - OOO samples are written into the WBL @@ -634,9 +702,7 @@ func (t *MultiTSDB) startTSDB(logger log.Logger, tenantID string, tenant *tenant nil, ) if err != nil { - t.mtx.Lock() - delete(t.tenants, tenantID) - t.mtx.Unlock() + t.removeTenantLocked(tenantID) return err } var ship *shipper.Shipper @@ -654,7 +720,12 @@ func (t *MultiTSDB) startTSDB(logger log.Logger, tenantID string, tenant *tenant shipper.DefaultMetaFilename, ) } - tenant.set(store.NewTSDBStore(logger, s, component.Receive, lset), s, ship, exemplars.NewTSDB(s, lset)) + options := []store.TSDBStoreOption{} + if t.metricNameFilterEnabled { + options = append(options, store.WithCuckooMetricNameStoreFilter()) + } + tenant.set(store.NewTSDBStore(logger, s, component.Receive, lset, options...), s, ship, exemplars.NewTSDB(s, lset)) + t.addTenantLocked(tenantID, tenant) // need to update the client list once store is ready & client != nil level.Info(logger).Log("msg", "TSDB is now ready") return nil } @@ -683,7 +754,7 @@ func (t *MultiTSDB) getOrLoadTenant(tenantID string, blockingStart bool) (*tenan } tenant = newTenant() - t.tenants[tenantID] = tenant + t.addTenantUnlocked(tenantID, tenant) t.mtx.Unlock() logger := log.With(t.logger, "tenant", tenantID) diff --git a/pkg/receive/multitsdb_test.go b/pkg/receive/multitsdb_test.go index 53d99cabfa..a36db4b402 100644 --- a/pkg/receive/multitsdb_test.go +++ b/pkg/receive/multitsdb_test.go @@ -5,6 +5,7 @@ package receive import ( "context" + "fmt" "io" "math" "os" @@ -39,6 +40,8 @@ import ( ) func TestMultiTSDB(t *testing.T) { + t.Parallel() + dir := t.TempDir() logger := log.NewLogfmtLogger(os.Stderr) @@ -191,7 +194,7 @@ func TestMultiTSDB(t *testing.T) { testutil.Ok(t, m.Open()) testutil.Ok(t, appendSample(m, testTenant, time.Now())) - tenant := m.tenants[testTenant] + tenant := m.testGetTenant(testTenant) db := tenant.readyStorage().Get() testutil.Equals(t, 0, len(db.Blocks())) @@ -416,6 +419,8 @@ func checkExemplarsResponse(t *testing.T, expected, data []exemplarspb.ExemplarD } func TestMultiTSDBPrune(t *testing.T) { + t.Parallel() + tests := []struct { name string bucket objstore.Bucket @@ -454,18 +459,22 @@ func TestMultiTSDBPrune(t *testing.T) { ) defer func() { testutil.Ok(t, m.Close()) }() - for i := 0; i < 100; i++ { - testutil.Ok(t, appendSample(m, "deleted-tenant", time.UnixMilli(int64(10+i)))) - testutil.Ok(t, appendSample(m, "compacted-tenant", time.Now().Add(-4*time.Hour))) - testutil.Ok(t, appendSample(m, "active-tenant", time.Now().Add(time.Duration(i)*time.Second))) + for step := time.Duration(0); step <= 2*time.Hour; step += time.Minute { + testutil.Ok(t, appendSample(m, "deleted-tenant", time.Now().Add(-9*time.Hour+step))) + testutil.Ok(t, appendSample(m, "compacted-tenant", time.Now().Add(-4*time.Hour+step))) + testutil.Ok(t, appendSample(m, "active-tenant", time.Now().Add(step))) } testutil.Equals(t, 3, len(m.TSDBLocalClients())) ctx, cancel := context.WithCancel(context.Background()) - defer cancel() + + g := sync.WaitGroup{} + defer func() { cancel(); g.Wait() }() if test.bucket != nil { + g.Add(1) go func() { + defer g.Done() testutil.Ok(t, syncTSDBs(ctx, m, 10*time.Millisecond)) }() } @@ -507,6 +516,8 @@ func syncTSDBs(ctx context.Context, m *MultiTSDB, interval time.Duration) error } func TestMultiTSDBRecreatePrunedTenant(t *testing.T) { + t.Parallel() + dir := t.TempDir() m := NewMultiTSDB(dir, log.NewNopLogger(), prometheus.NewRegistry(), @@ -531,7 +542,50 @@ func TestMultiTSDBRecreatePrunedTenant(t *testing.T) { testutil.Equals(t, 1, len(m.TSDBLocalClients())) } +func TestMultiTSDBAddNewTenant(t *testing.T) { + t.Parallel() + const iterations = 10 + // This test detects race conditions, so we run it multiple times to increase the chance of catching the issue. + for i := 0; i < iterations; i++ { + t.Run(fmt.Sprintf("iteration-%d", i), func(t *testing.T) { + dir := t.TempDir() + m := NewMultiTSDB(dir, log.NewNopLogger(), prometheus.NewRegistry(), + &tsdb.Options{ + MinBlockDuration: (2 * time.Hour).Milliseconds(), + MaxBlockDuration: (2 * time.Hour).Milliseconds(), + RetentionDuration: (6 * time.Hour).Milliseconds(), + }, + labels.FromStrings("replica", "test"), + "tenant_id", + objstore.NewInMemBucket(), + false, + metadata.NoneFunc, + ) + defer func() { testutil.Ok(t, m.Close()) }() + + concurrency := 50 + var wg sync.WaitGroup + for i := 0; i < concurrency; i++ { + wg.Add(1) + // simulate remote write with new tenant concurrently + go func(i int) { + defer wg.Done() + testutil.Ok(t, appendSample(m, fmt.Sprintf("tenant-%d", i), time.UnixMilli(int64(10)))) + }(i) + // simulate read request concurrently + go func() { + m.TSDBLocalClients() + }() + } + wg.Wait() + testutil.Equals(t, concurrency, len(m.TSDBLocalClients())) + }) + } +} + func TestAlignedHeadFlush(t *testing.T) { + t.Parallel() + hourInSeconds := int64(1 * 60 * 60) tests := []struct { @@ -613,6 +667,8 @@ func TestAlignedHeadFlush(t *testing.T) { } func TestMultiTSDBStats(t *testing.T) { + t.Parallel() + tests := []struct { name string tenants []string @@ -671,6 +727,8 @@ func TestMultiTSDBStats(t *testing.T) { // Regression test for https://github.com/thanos-io/thanos/issues/6047. func TestMultiTSDBWithNilStore(t *testing.T) { + t.Parallel() + dir := t.TempDir() m := NewMultiTSDB(dir, log.NewNopLogger(), prometheus.NewRegistry(), @@ -712,6 +770,8 @@ func (s *slowClient) LabelValues(ctx context.Context, r *storepb.LabelValuesRequ } func TestProxyLabelValues(t *testing.T) { + t.Parallel() + dir := t.TempDir() m := NewMultiTSDB( dir, nil, prometheus.NewRegistry(), &tsdb.Options{ @@ -783,7 +843,10 @@ func appendSampleWithLabels(m *MultiTSDB, tenant string, lbls labels.Labels, tim func queryLabelValues(ctx context.Context, m *MultiTSDB) error { proxy := store.NewProxyStore(nil, nil, func() []store.Client { - clients := m.TSDBLocalClients() + m.mtx.Lock() + defer m.mtx.Unlock() + clients := make([]store.Client, len(m.tsdbClients)) + copy(clients, m.tsdbClients) if len(clients) > 0 { clients[0] = &slowClient{clients[0]} } @@ -844,6 +907,8 @@ func BenchmarkMultiTSDB(b *testing.B) { } func TestMultiTSDBDoesNotDeleteNotUploadedBlocks(t *testing.T) { + t.Parallel() + tenant := &tenant{ mtx: &sync.RWMutex{}, } diff --git a/pkg/receive/receive_test.go b/pkg/receive/receive_test.go index ea1b6d81fd..bf38cb06ed 100644 --- a/pkg/receive/receive_test.go +++ b/pkg/receive/receive_test.go @@ -26,6 +26,8 @@ func TestMain(m *testing.M) { } func TestAddingExternalLabelsForTenants(t *testing.T) { + t.Parallel() + for _, tc := range []struct { name string cfg []HashringConfig @@ -208,7 +210,7 @@ func TestAddingExternalLabelsForTenants(t *testing.T) { for _, c := range tc.cfg { for _, tenantId := range c.Tenants { - if m.tenants[tenantId] == nil { + if m.testGetTenant(tenantId) == nil { err = appendSample(m, tenantId, time.Now()) require.NoError(t, err) } @@ -238,6 +240,8 @@ func TestAddingExternalLabelsForTenants(t *testing.T) { } func TestLabelSetsOfTenantsWhenAddingTenants(t *testing.T) { + t.Parallel() + initialConfig := []HashringConfig{ { Endpoints: []Endpoint{{Address: "node1"}}, @@ -290,7 +294,7 @@ func TestLabelSetsOfTenantsWhenAddingTenants(t *testing.T) { for _, c := range initialConfig { for _, tenantId := range c.Tenants { - if m.tenants[tenantId] == nil { + if m.testGetTenant(tenantId) == nil { err = appendSample(m, tenantId, time.Now()) require.NoError(t, err) } @@ -315,7 +319,7 @@ func TestLabelSetsOfTenantsWhenAddingTenants(t *testing.T) { for _, c := range changedConfig { for _, tenantId := range c.Tenants { - if m.tenants[tenantId] == nil { + if m.testGetTenant(tenantId) == nil { err = appendSample(m, tenantId, time.Now()) require.NoError(t, err) } @@ -347,6 +351,8 @@ func TestLabelSetsOfTenantsWhenAddingTenants(t *testing.T) { } func TestLabelSetsOfTenantsWhenChangingLabels(t *testing.T) { + t.Parallel() + initialConfig := []HashringConfig{ { Endpoints: []Endpoint{{Address: "node1"}}, @@ -528,7 +534,7 @@ func TestLabelSetsOfTenantsWhenChangingLabels(t *testing.T) { for _, c := range initialConfig { for _, tenantId := range c.Tenants { - if m.tenants[tenantId] == nil { + if m.testGetTenant(tenantId) == nil { err = appendSample(m, tenantId, time.Now()) require.NoError(t, err) } @@ -577,6 +583,8 @@ func TestLabelSetsOfTenantsWhenChangingLabels(t *testing.T) { } func TestAddingLabelsWhenTenantAppearsInMultipleHashrings(t *testing.T) { + t.Parallel() + initialConfig := []HashringConfig{ { Endpoints: []Endpoint{{Address: "node1"}}, @@ -696,7 +704,7 @@ func TestAddingLabelsWhenTenantAppearsInMultipleHashrings(t *testing.T) { for _, c := range initialConfig { for _, tenantId := range c.Tenants { - if m.tenants[tenantId] == nil { + if m.testGetTenant(tenantId) == nil { err = appendSample(m, tenantId, time.Now()) require.NoError(t, err) } @@ -745,6 +753,8 @@ func TestAddingLabelsWhenTenantAppearsInMultipleHashrings(t *testing.T) { } func TestReceiverLabelsNotOverwrittenByExternalLabels(t *testing.T) { + t.Parallel() + cfg := []HashringConfig{ { Endpoints: []Endpoint{{Address: "node1"}}, @@ -768,7 +778,7 @@ func TestReceiverLabelsNotOverwrittenByExternalLabels(t *testing.T) { for _, c := range cfg { for _, tenantId := range c.Tenants { - if m.tenants[tenantId] == nil { + if m.testGetTenant(tenantId) == nil { err = appendSample(m, tenantId, time.Now()) require.NoError(t, err) } diff --git a/pkg/receive/request_limiter_test.go b/pkg/receive/request_limiter_test.go index 10c131b12f..78a9f82f85 100644 --- a/pkg/receive/request_limiter_test.go +++ b/pkg/receive/request_limiter_test.go @@ -10,6 +10,8 @@ import ( ) func TestRequestLimiter_limitsFor(t *testing.T) { + t.Parallel() + tenantWithLimits := "limited-tenant" tenantWithoutLimits := "unlimited-tenant" @@ -59,6 +61,8 @@ func TestRequestLimiter_limitsFor(t *testing.T) { } func TestRequestLimiter_AllowRequestBodySizeBytes(t *testing.T) { + t.Parallel() + tests := []struct { name string defaultLimits *requestLimitsConfig @@ -117,6 +121,8 @@ func TestRequestLimiter_AllowRequestBodySizeBytes(t *testing.T) { } func TestRequestLimiter_AllowSeries(t *testing.T) { + t.Parallel() + tests := []struct { name string seriesLimit int64 @@ -175,6 +181,8 @@ func TestRequestLimiter_AllowSeries(t *testing.T) { } func TestRequestLimiter_AllowSamples(t *testing.T) { + t.Parallel() + tests := []struct { name string samplesLimit int64 diff --git a/pkg/receive/writecapnp/client.go b/pkg/receive/writecapnp/client.go new file mode 100644 index 0000000000..3cd9f2d082 --- /dev/null +++ b/pkg/receive/writecapnp/client.go @@ -0,0 +1,133 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package writecapnp + +import ( + "context" + "net" + "sync" + + "capnproto.org/go/capnp/v3" + "capnproto.org/go/capnp/v3/rpc" + "github.com/go-kit/log" + "github.com/go-kit/log/level" + "github.com/pkg/errors" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/thanos-io/thanos/pkg/store/storepb" +) + +type Dialer interface { + Dial() (net.Conn, error) +} + +type TCPDialer struct { + address string +} + +func NewTCPDialer(address string) *TCPDialer { + return &TCPDialer{address: address} +} + +func (t TCPDialer) Dial() (net.Conn, error) { + addr, err := net.ResolveTCPAddr("tcp", t.address) + if err != nil { + return nil, err + } + conn, err := net.DialTCP("tcp", nil, addr) + if err != nil { + return nil, errors.Wrapf(err, "failed to dial peer %s", t.address) + } + return conn, nil +} + +type RemoteWriteClient struct { + mu sync.Mutex + + dialer Dialer + conn *rpc.Conn + + writer Writer + logger log.Logger +} + +func NewRemoteWriteClient(dialer Dialer, logger log.Logger) *RemoteWriteClient { + return &RemoteWriteClient{ + dialer: dialer, + logger: logger, + } +} + +func (r *RemoteWriteClient) RemoteWrite(ctx context.Context, in *storepb.WriteRequest, _ ...grpc.CallOption) (*storepb.WriteResponse, error) { + return r.writeWithReconnect(ctx, 2, in) +} + +func (r *RemoteWriteClient) writeWithReconnect(ctx context.Context, numReconnects int, in *storepb.WriteRequest) (*storepb.WriteResponse, error) { + if err := r.connect(ctx); err != nil { + return nil, err + } + + result, release := r.writer.Write(ctx, func(params Writer_write_Params) error { + wr, err := params.NewWr() + if err != nil { + return err + } + return BuildInto(wr, in.Tenant, in.Timeseries) + }) + defer release() + + s, err := result.Struct() + if err != nil { + if numReconnects > 0 && capnp.IsDisconnected(err) { + level.Warn(r.logger).Log("msg", "rpc failed, reconnecting") + if err := r.Close(); err != nil { + return nil, err + } + numReconnects-- + return r.writeWithReconnect(ctx, numReconnects, in) + } + return nil, errors.Wrap(err, "failed writing to peer") + } + switch s.Error() { + case WriteError_unavailable: + return nil, status.Error(codes.Unavailable, "rpc failed") + case WriteError_alreadyExists: + return nil, status.Error(codes.AlreadyExists, "rpc failed") + case WriteError_invalidArgument: + return nil, status.Error(codes.InvalidArgument, "rpc failed") + case WriteError_internal: + return nil, status.Error(codes.Internal, "rpc failed") + default: + return &storepb.WriteResponse{}, nil + } +} + +func (r *RemoteWriteClient) connect(ctx context.Context) error { + r.mu.Lock() + defer r.mu.Unlock() + if r.conn != nil { + return nil + } + + conn, err := r.dialer.Dial() + if err != nil { + return errors.Wrap(err, "failed to dial peer") + } + r.conn = rpc.NewConn(rpc.NewPackedStreamTransport(conn), nil) + r.writer = Writer(r.conn.Bootstrap(ctx)) + return nil +} + +func (r *RemoteWriteClient) Close() error { + r.mu.Lock() + if r.conn != nil { + conn := r.conn + r.conn = nil + go conn.Close() + } + r.mu.Unlock() + return nil +} diff --git a/pkg/receive/writecapnp/marshal.go b/pkg/receive/writecapnp/marshal.go new file mode 100644 index 0000000000..efc1a8ef03 --- /dev/null +++ b/pkg/receive/writecapnp/marshal.go @@ -0,0 +1,286 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package writecapnp + +import ( + "capnproto.org/go/capnp/v3" + + "github.com/pkg/errors" + + "github.com/thanos-io/thanos/pkg/store/labelpb" + "github.com/thanos-io/thanos/pkg/store/storepb/prompb" +) + +func Marshal(tenant string, tsreq []prompb.TimeSeries) ([]byte, error) { + wr, err := Build(tenant, tsreq) + if err != nil { + return nil, err + } + + return wr.Message().Marshal() +} + +func MarshalPacked(tenant string, tsreq []prompb.TimeSeries) ([]byte, error) { + wr, err := Build(tenant, tsreq) + if err != nil { + return nil, err + } + + return wr.Message().MarshalPacked() +} + +func Build(tenant string, tsreq []prompb.TimeSeries) (WriteRequest, error) { + arena := capnp.SingleSegment(nil) + _, seg, err := capnp.NewMessage(arena) + if err != nil { + return WriteRequest{}, err + } + wr, err := NewRootWriteRequest(seg) + if err != nil { + return WriteRequest{}, err + } + if err := BuildInto(wr, tenant, tsreq); err != nil { + return WriteRequest{}, err + } + return wr, nil +} + +func BuildInto(wr WriteRequest, tenant string, tsreq []prompb.TimeSeries) error { + if err := wr.SetTenant(tenant); err != nil { + return errors.Wrap(err, "set tenant") + } + + series, err := wr.NewTimeSeries(int32(len(tsreq))) + if err != nil { + return err + } + builder := newSymbolsBuilder() + for i, ts := range tsreq { + tsc := series.At(i) + + lblsc, err := tsc.NewLabels(int32(len(ts.Labels))) + if err != nil { + return errors.Wrap(err, "new labels") + } + if err := marshalLabels(lblsc, ts.Labels, builder); err != nil { + return errors.Wrap(err, "marshal labels") + } + if err := marshalSamples(tsc, ts.Samples); err != nil { + return errors.Wrap(err, "marshal samples") + } + if err := marshalHistograms(tsc, ts.Histograms); err != nil { + return errors.Wrap(err, "marshal histograms") + } + if err := marshalExemplars(tsc, ts.Exemplars, builder); err != nil { + return errors.Wrap(err, "marshal exemplars") + } + } + + symbols, err := wr.NewSymbols() + if err != nil { + return errors.Wrap(err, "new symbols") + } + if err := marshalSymbols(builder, symbols); err != nil { + return errors.Wrap(err, "marshal symbols") + } + return nil +} + +func marshalSymbols(builder *symbolsBuilder, symbols Symbols) error { + offsets, err := symbols.NewOffsets(builder.len()) + if err != nil { + return err + } + data := make([]byte, builder.symbolsSize) + for k, entry := range builder.table { + end := entry.start + uint32(len(k)) + copy(data[entry.start:end], k) + offsets.Set(int(entry.index), end) + } + + return symbols.SetData(data) +} + +func marshalLabels(lbls Label_List, pbLbls []labelpb.ZLabel, symbols *symbolsBuilder) error { + for i, pbLbl := range pbLbls { + lbl := lbls.At(i) + lbl.SetName(symbols.addEntry(pbLbl.Name)) + lbl.SetValue(symbols.addEntry(pbLbl.Value)) + } + return nil +} + +func marshalSamples(ts TimeSeries, pbSamples []prompb.Sample) error { + samples, err := ts.NewSamples(int32(len(pbSamples))) + if err != nil { + return err + } + + for j, sample := range pbSamples { + sc := samples.At(j) + sc.SetTimestamp(sample.Timestamp) + sc.SetValue(sample.Value) + } + return nil +} + +func marshalHistograms(ts TimeSeries, pbHistograms []prompb.Histogram) error { + if len(pbHistograms) == 0 { + return nil + } + histograms, err := ts.NewHistograms(int32(len(pbHistograms))) + if err != nil { + return err + } + for i, h := range pbHistograms { + if err := marshalHistogram(histograms.At(i), h); err != nil { + return err + } + } + return nil +} + +func marshalHistogram(histogram Histogram, h prompb.Histogram) error { + histogram.SetResetHint(Histogram_ResetHint(h.ResetHint)) + switch h.Count.(type) { + case *prompb.Histogram_CountInt: + histogram.Count().SetCountInt(h.GetCountInt()) + case *prompb.Histogram_CountFloat: + histogram.Count().SetCountFloat(h.GetCountFloat()) + } + histogram.SetSum(h.Sum) + histogram.SetSchema(h.Schema) + histogram.SetZeroThreshold(h.ZeroThreshold) + + switch h.ZeroCount.(type) { + case *prompb.Histogram_ZeroCountInt: + histogram.ZeroCount().SetZeroCountInt(h.GetZeroCountInt()) + case *prompb.Histogram_ZeroCountFloat: + histogram.ZeroCount().SetZeroCountFloat(h.GetZeroCountFloat()) + } + + // Negative spans, deltas and counts. + negativeSpans, err := histogram.NewNegativeSpans(int32(len(h.NegativeSpans))) + if err != nil { + return err + } + if err := marshalSpans(negativeSpans, h.NegativeSpans); err != nil { + return err + } + negativeDeltas, err := histogram.NewNegativeDeltas(int32(len(h.NegativeDeltas))) + if err != nil { + return err + } + marshalInt64List(negativeDeltas, h.NegativeDeltas) + + negativeCounts, err := histogram.NewNegativeCounts(int32(len(h.NegativeCounts))) + if err != nil { + return err + } + marshalFloat64List(negativeCounts, h.NegativeCounts) + + // Positive spans, deltas and counts. + positiveSpans, err := histogram.NewPositiveSpans(int32(len(h.PositiveSpans))) + if err != nil { + return err + } + if err := marshalSpans(positiveSpans, h.PositiveSpans); err != nil { + return err + } + positiveDeltas, err := histogram.NewPositiveDeltas(int32(len(h.PositiveDeltas))) + if err != nil { + return err + } + marshalInt64List(positiveDeltas, h.PositiveDeltas) + + positiveCounts, err := histogram.NewPositiveCounts(int32(len(h.PositiveCounts))) + if err != nil { + return err + } + marshalFloat64List(positiveCounts, h.PositiveCounts) + + histogram.SetTimestamp(h.Timestamp) + + return nil +} + +func marshalSpans(spans BucketSpan_List, pbSpans []prompb.BucketSpan) error { + for j, s := range pbSpans { + span := spans.At(j) + span.SetOffset(s.Offset) + span.SetLength(s.Length) + } + return nil +} + +func marshalExemplars(ts TimeSeries, pbExemplars []prompb.Exemplar, symbols *symbolsBuilder) error { + if len(pbExemplars) == 0 { + return nil + } + + exemplars, err := ts.NewExemplars(int32(len(pbExemplars))) + if err != nil { + return err + } + for i := 0; i < len(pbExemplars); i++ { + ex := exemplars.At(i) + + lbls, err := ex.NewLabels(int32(len(pbExemplars[i].Labels))) + if err != nil { + return err + } + if err := marshalLabels(lbls, pbExemplars[i].Labels, symbols); err != nil { + return err + } + ex.SetValue(pbExemplars[i].Value) + ex.SetTimestamp(pbExemplars[i].Timestamp) + } + return nil +} + +func marshalInt64List(list capnp.Int64List, ints []int64) { + for j, d := range ints { + list.Set(j, d) + } +} + +func marshalFloat64List(list capnp.Float64List, ints []float64) { + for j, d := range ints { + list.Set(j, d) + } +} + +type symbolsBuilder struct { + table map[string]tableEntry + symbolsSize uint32 +} + +func newSymbolsBuilder() *symbolsBuilder { + return &symbolsBuilder{ + table: make(map[string]tableEntry), + } +} + +func (s *symbolsBuilder) addEntry(item string) uint32 { + entry, ok := s.table[item] + if ok { + return entry.index + } + entry = tableEntry{ + index: uint32(len(s.table)), + start: s.symbolsSize, + } + s.symbolsSize += uint32(len(item)) + s.table[item] = entry + return entry.index +} + +func (s *symbolsBuilder) len() int32 { + return int32(len(s.table)) +} + +type tableEntry struct { + index uint32 + start uint32 +} diff --git a/pkg/receive/writecapnp/marshal_bench_test.go b/pkg/receive/writecapnp/marshal_bench_test.go new file mode 100644 index 0000000000..2b29426daf --- /dev/null +++ b/pkg/receive/writecapnp/marshal_bench_test.go @@ -0,0 +1,144 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package writecapnp + +import ( + "bytes" + "fmt" + "testing" + + "capnproto.org/go/capnp/v3" + "github.com/stretchr/testify/require" + + "github.com/thanos-io/thanos/pkg/store/labelpb" + "github.com/thanos-io/thanos/pkg/store/storepb" + "github.com/thanos-io/thanos/pkg/store/storepb/prompb" +) + +func BenchmarkMarshalWriteRequest(b *testing.B) { + const ( + numSeries = 2 + numClusters = 3 + numPods = 2 + ) + series := make([]prompb.TimeSeries, 0, numSeries) + for i := 0; i < numSeries; i++ { + lbls := make([]labelpb.ZLabel, 0, numClusters*numPods) + for j := 0; j < numClusters; j++ { + for k := 0; k < numPods; k++ { + lbls = append(lbls, labelpb.ZLabel{ + Name: fmt.Sprintf("cluster-%d", j), + Value: fmt.Sprintf("pod-%d", k), + }) + } + } + series = append(series, prompb.TimeSeries{ + Labels: lbls, + Samples: []prompb.Sample{ + { + Value: 1, + Timestamp: 2, + }, + }, + }) + } + wreq := storepb.WriteRequest{ + Tenant: "example-tenant", + Timeseries: series, + } + var ( + protoBytes, err = wreq.Marshal() + capnprotoBytes, paddedErr = Marshal(wreq.Tenant, wreq.Timeseries) + capnprotoBytesPacked, packedErr = MarshalPacked(wreq.Tenant, wreq.Timeseries) + ) + require.NoError(b, err) + require.NoError(b, paddedErr) + require.NoError(b, packedErr) + b.Run("marshal_proto", func(b *testing.B) { + for i := 0; i < b.N; i++ { + var err error + _, err = wreq.Marshal() + require.NoError(b, err) + } + }) + b.Run("build", func(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := Build("example_tenant", wreq.Timeseries) + require.NoError(b, err) + } + }) + b.Run("encode", func(b *testing.B) { + for i := 0; i < b.N; i++ { + var err error + wr, err := Build("example_tenant", wreq.Timeseries) + require.NoError(b, err) + + buf := bytes.NewBuffer(nil) + require.NoError(b, capnp.NewEncoder(buf).Encode(wr.Message())) + } + }) + b.Run("encode_packed", func(b *testing.B) { + for i := 0; i < b.N; i++ { + var err error + wr, err := Build("example_tenant", wreq.Timeseries) + require.NoError(b, err) + + buf := bytes.NewBuffer(nil) + require.NoError(b, capnp.NewPackedEncoder(buf).Encode(wr.Message())) + } + }) + + b.Run("unmarshal_proto", func(b *testing.B) { + for i := 0; i < b.N; i++ { + wr := storepb.WriteRequest{} + require.NoError(b, wr.Unmarshal(protoBytes)) + } + }) + b.Run("unmarshal", func(b *testing.B) { + for i := 0; i < b.N; i++ { + msg, err := capnp.Unmarshal(capnprotoBytes) + require.NoError(b, err) + + _, err = ReadRootWriteRequest(msg) + require.NoError(b, err) + } + }) + b.Run("unmarshal_packed", func(b *testing.B) { + for i := 0; i < b.N; i++ { + msg, err := capnp.UnmarshalPacked(capnprotoBytesPacked) + require.NoError(b, err) + + _, err = ReadRootWriteRequest(msg) + require.NoError(b, err) + } + }) + + b.Run("decoder", func(b *testing.B) { + for i := 0; i < b.N; i++ { + msg, err := capnp.NewDecoder(bytes.NewReader(capnprotoBytes)).Decode() + require.NoError(b, err) + + _, err = ReadRootWriteRequest(msg) + require.NoError(b, err) + } + }) + b.Run("decoder_packed", func(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + msg, err := capnp.NewPackedDecoder(bytes.NewReader(capnprotoBytesPacked)).Decode() + require.NoError(b, err) + + wr, err := ReadRootWriteRequest(msg) + require.NoError(b, err) + + var ts Series + iter, err := NewRequest(wr) + require.NoError(b, err) + for iter.Next() { + require.NoError(b, iter.At(&ts)) + } + iter.Close() + } + }) +} diff --git a/pkg/receive/writecapnp/marshal_test.go b/pkg/receive/writecapnp/marshal_test.go new file mode 100644 index 0000000000..bffc7a6d6a --- /dev/null +++ b/pkg/receive/writecapnp/marshal_test.go @@ -0,0 +1,222 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package writecapnp + +import ( + "fmt" + "testing" + + "github.com/prometheus/prometheus/model/histogram" + "github.com/prometheus/prometheus/model/labels" + + "capnproto.org/go/capnp/v3" + "github.com/prometheus/prometheus/tsdb/tsdbutil" + "github.com/stretchr/testify/require" + + "github.com/thanos-io/thanos/pkg/store/labelpb" + "github.com/thanos-io/thanos/pkg/store/storepb" + "github.com/thanos-io/thanos/pkg/store/storepb/prompb" +) + +func TestMarshalWriteRequest(t *testing.T) { + testHistogram := &histogram.Histogram{ + Count: 12, + ZeroCount: 2, + ZeroThreshold: 0.001, + Sum: 18.4, + Schema: 1, + PositiveSpans: []histogram.Span{ + {Offset: 0, Length: 2}, + {Offset: 1, Length: 2}, + }, + PositiveBuckets: []int64{1, 1, -1, 0}, + NegativeSpans: []histogram.Span{ + {Offset: 0, Length: 2}, + {Offset: 1, Length: 2}, + }, + NegativeBuckets: []int64{1, 1, -1, 0}, + } + + wreq := storepb.WriteRequest{ + Tenant: "example-tenant", + Timeseries: []prompb.TimeSeries{ + { + Labels: []labelpb.ZLabel{ + {Name: "__name__", Value: "up"}, + {Name: "job", Value: "prometheus"}, + }, + Samples: []prompb.Sample{ + {Timestamp: 1, Value: 1}, + {Timestamp: 2, Value: 2}, + }, + Histograms: []prompb.Histogram{ + prompb.HistogramToHistogramProto(1, testHistogram), + prompb.FloatHistogramToHistogramProto(2, tsdbutil.GenerateTestFloatHistogram(2)), + }, + Exemplars: []prompb.Exemplar{ + { + Labels: []labelpb.ZLabel{{Name: "traceID", Value: "1234"}}, + Value: 10, + Timestamp: 14, + }, + }, + }, + { + Labels: []labelpb.ZLabel{ + {Name: "__name__", Value: "up"}, + {Name: "job", Value: "thanos"}, + }, + Samples: []prompb.Sample{ + {Timestamp: 3, Value: 3}, + {Timestamp: 4, Value: 4}, + }, + }, + }, + } + b, err := Marshal(wreq.Tenant, wreq.Timeseries) + require.NoError(t, err) + + msg, err := capnp.Unmarshal(b) + require.NoError(t, err) + + wr, err := ReadRootWriteRequest(msg) + require.NoError(t, err) + + tenant, err := wr.Tenant() + require.NoError(t, err) + require.Equal(t, wreq.Tenant, tenant) + + series, err := wr.TimeSeries() + require.NoError(t, err) + require.Equal(t, len(wreq.Timeseries), series.Len()) + + var ( + i int + actual Series + ) + request, err := NewRequest(wr) + require.NoError(t, err) + for request.Next() { + require.NoError(t, request.At(&actual)) + expected := wreq.Timeseries[i] + + t.Run("test_labels", func(t *testing.T) { + builder := labels.ScratchBuilder{} + for _, lbl := range expected.Labels { + builder.Add(lbl.Name, lbl.Value) + } + builder.Sort() + require.Equal(t, builder.Labels(), actual.Labels, fmt.Sprintf("incorrect series labels at %d", i)) + }) + t.Run("test_float_samples", func(t *testing.T) { + expectedSamples := make([]FloatSample, 0) + for _, s := range expected.Samples { + expectedSamples = append(expectedSamples, FloatSample{ + Value: s.Value, + Timestamp: s.Timestamp, + }) + } + require.Equal(t, expectedSamples, actual.Samples, fmt.Sprintf("incorrect series samples at %d", i)) + }) + t.Run("test_histogram_samples", func(t *testing.T) { + for i, hs := range expected.Histograms { + require.Equal(t, hs.Timestamp, actual.Histograms[i].Timestamp) + if hs.IsFloatHistogram() { + fh := prompb.FloatHistogramProtoToFloatHistogram(hs) + require.Equal(t, fh, actual.Histograms[i].FloatHistogram) + } else { + h := prompb.HistogramProtoToHistogram(hs) + require.Equal(t, h, actual.Histograms[i].Histogram) + } + } + }) + t.Run("test_exemplars", func(t *testing.T) { + for i, ex := range expected.Exemplars { + require.Equal(t, labelpb.ZLabelsToPromLabels(ex.Labels), actual.Exemplars[i].Labels) + require.Equal(t, ex.Timestamp, actual.Exemplars[i].Ts) + require.Equal(t, ex.Value, actual.Exemplars[i].Value) + } + }) + + i++ + } +} + +func TestMarshalWithMultipleHistogramSeries(t *testing.T) { + wreq := storepb.WriteRequest{ + Tenant: "example-tenant", + Timeseries: []prompb.TimeSeries{ + { + Labels: []labelpb.ZLabel{ + {Name: "job", Value: "prometheus-1"}, + }, + Histograms: []prompb.Histogram{ + prompb.HistogramToHistogramProto(1, &histogram.Histogram{}), + prompb.HistogramToHistogramProto(1, tsdbutil.GenerateTestHistogram(1)), + prompb.FloatHistogramToHistogramProto(2, tsdbutil.GenerateTestFloatHistogram(2)), + }, + }, + { + Labels: []labelpb.ZLabel{ + {Name: "job", Value: "prometheus-2"}, + }, + Histograms: []prompb.Histogram{ + prompb.HistogramToHistogramProto(1, tsdbutil.GenerateTestHistogram(1)), + prompb.FloatHistogramToHistogramProto(2, tsdbutil.GenerateTestFloatHistogram(2)), + prompb.HistogramToHistogramProto(1, &histogram.Histogram{}), + }, + }, + }, + } + b, err := Marshal(wreq.Tenant, wreq.Timeseries) + require.NoError(t, err) + + msg, err := capnp.Unmarshal(b) + require.NoError(t, err) + + wr, err := ReadRootWriteRequest(msg) + require.NoError(t, err) + + tenant, err := wr.Tenant() + require.NoError(t, err) + require.Equal(t, wreq.Tenant, tenant) + + series, err := wr.TimeSeries() + require.NoError(t, err) + require.Equal(t, len(wreq.Timeseries), series.Len()) + var ( + current Series + + readHistograms []*histogram.Histogram + readFloatHistograms []*histogram.FloatHistogram + ) + request, err := NewRequest(wr) + require.NoError(t, err) + + for request.Next() { + require.NoError(t, request.At(¤t)) + for _, h := range current.Histograms { + if h.FloatHistogram != nil { + readFloatHistograms = append(readFloatHistograms, h.FloatHistogram) + } else { + readHistograms = append(readHistograms, h.Histogram) + } + } + } + var ( + histograms []*histogram.Histogram + floatHistograms []*histogram.FloatHistogram + ) + for _, ts := range wreq.Timeseries { + for _, h := range ts.Histograms { + if h.IsFloatHistogram() { + floatHistograms = append(floatHistograms, prompb.FloatHistogramProtoToFloatHistogram(h)) + } else { + histograms = append(histograms, prompb.HistogramProtoToHistogram(h)) + } + } + } + require.Equal(t, histograms, readHistograms) + require.Equal(t, floatHistograms, readFloatHistograms) +} diff --git a/pkg/receive/writecapnp/write_request.capnp b/pkg/receive/writecapnp/write_request.capnp new file mode 100644 index 0000000000..7c82edc5b3 --- /dev/null +++ b/pkg/receive/writecapnp/write_request.capnp @@ -0,0 +1,92 @@ +using Go = import "/go.capnp"; +@0x85d3acc39d94e0f8; + +$Go.package("writecapnp"); +$Go.import("writecapnp"); + +struct Symbols { + data @0 :Data; + offsets @1 :List(UInt32); +} + +struct Label { + name @0 :UInt32; + value @1 :UInt32; +} + +struct Sample { + timestamp @0 :Int64; + value @1 :Float64; +} + +struct BucketSpan { + offset @0 :Int32; + length @1 :UInt32; +} + +struct Histogram { + enum ResetHint { + unknown @0; + yes @1; + no @2; + gauge @3; + } + + count :union { + countInt @0 :UInt64; + countFloat @1 :Float64; + } + + sum @2 :Float64; + schema @3 :Int32; + zeroThreshold @4 :Float64; + + zeroCount :union { + zeroCountInt @5 :UInt64; + zeroCountFloat @6 :Float64; + } + + negativeSpans @7 :List(BucketSpan); + negativeDeltas @8 :List(Int64); + negativeCounts @9 :List(Float64); + + positiveSpans @10 :List(BucketSpan); + positiveDeltas @11 :List(Int64); + positiveCounts @12 :List(Float64); + + resetHint @13 :ResetHint; + + timestamp @14 :Int64; +} + +struct Exemplar { + labels @0 :List(Label); + value @1 :Float64; + timestamp @2 :Int64; +} + +struct TimeSeries { + labels @0 :List(Label); + samples @1 :List(Sample); + histograms @2: List(Histogram); + exemplars @3: List(Exemplar); +} + +struct WriteRequest { + symbols @0: Symbols; + timeSeries @1 :List(TimeSeries); + tenant @2: Text; +} + +enum WriteError { + none @0; + unavailable @1; + alreadyExists @2; + invalidArgument @3; + internal @4; +} + +interface Writer { + write @0 (wr :WriteRequest) -> (error :WriteError); +} + diff --git a/pkg/receive/writecapnp/write_request.capnp.go b/pkg/receive/writecapnp/write_request.capnp.go new file mode 100644 index 0000000000..45b35e985d --- /dev/null +++ b/pkg/receive/writecapnp/write_request.capnp.go @@ -0,0 +1,1694 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +// Code generated by capnpc-go. DO NOT EDIT. + +package writecapnp + +import ( + context "context" + math "math" + strconv "strconv" + + capnp "capnproto.org/go/capnp/v3" + text "capnproto.org/go/capnp/v3/encoding/text" + fc "capnproto.org/go/capnp/v3/flowcontrol" + schemas "capnproto.org/go/capnp/v3/schemas" + server "capnproto.org/go/capnp/v3/server" +) + +type Symbols capnp.Struct + +// Symbols_TypeID is the unique identifier for the type Symbols. +const Symbols_TypeID = 0xab79e1a6ecfeb87a + +func NewSymbols(s *capnp.Segment) (Symbols, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2}) + return Symbols(st), err +} + +func NewRootSymbols(s *capnp.Segment) (Symbols, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2}) + return Symbols(st), err +} + +func ReadRootSymbols(msg *capnp.Message) (Symbols, error) { + root, err := msg.Root() + return Symbols(root.Struct()), err +} + +func (s Symbols) String() string { + str, _ := text.Marshal(0xab79e1a6ecfeb87a, capnp.Struct(s)) + return str +} + +func (s Symbols) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (Symbols) DecodeFromPtr(p capnp.Ptr) Symbols { + return Symbols(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s Symbols) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s Symbols) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Symbols) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Symbols) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Symbols) Data() ([]byte, error) { + p, err := capnp.Struct(s).Ptr(0) + return []byte(p.Data()), err +} + +func (s Symbols) HasData() bool { + return capnp.Struct(s).HasPtr(0) +} + +func (s Symbols) SetData(v []byte) error { + return capnp.Struct(s).SetData(0, v) +} + +func (s Symbols) Offsets() (capnp.UInt32List, error) { + p, err := capnp.Struct(s).Ptr(1) + return capnp.UInt32List(p.List()), err +} + +func (s Symbols) HasOffsets() bool { + return capnp.Struct(s).HasPtr(1) +} + +func (s Symbols) SetOffsets(v capnp.UInt32List) error { + return capnp.Struct(s).SetPtr(1, v.ToPtr()) +} + +// NewOffsets sets the offsets field to a newly +// allocated capnp.UInt32List, preferring placement in s's segment. +func (s Symbols) NewOffsets(n int32) (capnp.UInt32List, error) { + l, err := capnp.NewUInt32List(capnp.Struct(s).Segment(), n) + if err != nil { + return capnp.UInt32List{}, err + } + err = capnp.Struct(s).SetPtr(1, l.ToPtr()) + return l, err +} + +// Symbols_List is a list of Symbols. +type Symbols_List = capnp.StructList[Symbols] + +// NewSymbols creates a new list of Symbols. +func NewSymbols_List(s *capnp.Segment, sz int32) (Symbols_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 2}, sz) + return capnp.StructList[Symbols](l), err +} + +// Symbols_Future is a wrapper for a Symbols promised by a client call. +type Symbols_Future struct{ *capnp.Future } + +func (f Symbols_Future) Struct() (Symbols, error) { + p, err := f.Future.Ptr() + return Symbols(p.Struct()), err +} + +type Label capnp.Struct + +// Label_TypeID is the unique identifier for the type Label. +const Label_TypeID = 0xf192c7ee07114b32 + +func NewLabel(s *capnp.Segment) (Label, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}) + return Label(st), err +} + +func NewRootLabel(s *capnp.Segment) (Label, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}) + return Label(st), err +} + +func ReadRootLabel(msg *capnp.Message) (Label, error) { + root, err := msg.Root() + return Label(root.Struct()), err +} + +func (s Label) String() string { + str, _ := text.Marshal(0xf192c7ee07114b32, capnp.Struct(s)) + return str +} + +func (s Label) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (Label) DecodeFromPtr(p capnp.Ptr) Label { + return Label(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s Label) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s Label) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Label) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Label) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Label) Name() uint32 { + return capnp.Struct(s).Uint32(0) +} + +func (s Label) SetName(v uint32) { + capnp.Struct(s).SetUint32(0, v) +} + +func (s Label) Value() uint32 { + return capnp.Struct(s).Uint32(4) +} + +func (s Label) SetValue(v uint32) { + capnp.Struct(s).SetUint32(4, v) +} + +// Label_List is a list of Label. +type Label_List = capnp.StructList[Label] + +// NewLabel creates a new list of Label. +func NewLabel_List(s *capnp.Segment, sz int32) (Label_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}, sz) + return capnp.StructList[Label](l), err +} + +// Label_Future is a wrapper for a Label promised by a client call. +type Label_Future struct{ *capnp.Future } + +func (f Label_Future) Struct() (Label, error) { + p, err := f.Future.Ptr() + return Label(p.Struct()), err +} + +type Sample capnp.Struct + +// Sample_TypeID is the unique identifier for the type Sample. +const Sample_TypeID = 0xef49df6cfa8875de + +func NewSample(s *capnp.Segment) (Sample, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 16, PointerCount: 0}) + return Sample(st), err +} + +func NewRootSample(s *capnp.Segment) (Sample, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 16, PointerCount: 0}) + return Sample(st), err +} + +func ReadRootSample(msg *capnp.Message) (Sample, error) { + root, err := msg.Root() + return Sample(root.Struct()), err +} + +func (s Sample) String() string { + str, _ := text.Marshal(0xef49df6cfa8875de, capnp.Struct(s)) + return str +} + +func (s Sample) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (Sample) DecodeFromPtr(p capnp.Ptr) Sample { + return Sample(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s Sample) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s Sample) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Sample) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Sample) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Sample) Timestamp() int64 { + return int64(capnp.Struct(s).Uint64(0)) +} + +func (s Sample) SetTimestamp(v int64) { + capnp.Struct(s).SetUint64(0, uint64(v)) +} + +func (s Sample) Value() float64 { + return math.Float64frombits(capnp.Struct(s).Uint64(8)) +} + +func (s Sample) SetValue(v float64) { + capnp.Struct(s).SetUint64(8, math.Float64bits(v)) +} + +// Sample_List is a list of Sample. +type Sample_List = capnp.StructList[Sample] + +// NewSample creates a new list of Sample. +func NewSample_List(s *capnp.Segment, sz int32) (Sample_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 16, PointerCount: 0}, sz) + return capnp.StructList[Sample](l), err +} + +// Sample_Future is a wrapper for a Sample promised by a client call. +type Sample_Future struct{ *capnp.Future } + +func (f Sample_Future) Struct() (Sample, error) { + p, err := f.Future.Ptr() + return Sample(p.Struct()), err +} + +type BucketSpan capnp.Struct + +// BucketSpan_TypeID is the unique identifier for the type BucketSpan. +const BucketSpan_TypeID = 0x983649d193295eae + +func NewBucketSpan(s *capnp.Segment) (BucketSpan, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}) + return BucketSpan(st), err +} + +func NewRootBucketSpan(s *capnp.Segment) (BucketSpan, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}) + return BucketSpan(st), err +} + +func ReadRootBucketSpan(msg *capnp.Message) (BucketSpan, error) { + root, err := msg.Root() + return BucketSpan(root.Struct()), err +} + +func (s BucketSpan) String() string { + str, _ := text.Marshal(0x983649d193295eae, capnp.Struct(s)) + return str +} + +func (s BucketSpan) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (BucketSpan) DecodeFromPtr(p capnp.Ptr) BucketSpan { + return BucketSpan(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s BucketSpan) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s BucketSpan) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s BucketSpan) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s BucketSpan) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s BucketSpan) Offset() int32 { + return int32(capnp.Struct(s).Uint32(0)) +} + +func (s BucketSpan) SetOffset(v int32) { + capnp.Struct(s).SetUint32(0, uint32(v)) +} + +func (s BucketSpan) Length() uint32 { + return capnp.Struct(s).Uint32(4) +} + +func (s BucketSpan) SetLength(v uint32) { + capnp.Struct(s).SetUint32(4, v) +} + +// BucketSpan_List is a list of BucketSpan. +type BucketSpan_List = capnp.StructList[BucketSpan] + +// NewBucketSpan creates a new list of BucketSpan. +func NewBucketSpan_List(s *capnp.Segment, sz int32) (BucketSpan_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}, sz) + return capnp.StructList[BucketSpan](l), err +} + +// BucketSpan_Future is a wrapper for a BucketSpan promised by a client call. +type BucketSpan_Future struct{ *capnp.Future } + +func (f BucketSpan_Future) Struct() (BucketSpan, error) { + p, err := f.Future.Ptr() + return BucketSpan(p.Struct()), err +} + +type Histogram capnp.Struct +type Histogram_count Histogram +type Histogram_zeroCount Histogram +type Histogram_count_Which uint16 + +const ( + Histogram_count_Which_countInt Histogram_count_Which = 0 + Histogram_count_Which_countFloat Histogram_count_Which = 1 +) + +func (w Histogram_count_Which) String() string { + const s = "countIntcountFloat" + switch w { + case Histogram_count_Which_countInt: + return s[0:8] + case Histogram_count_Which_countFloat: + return s[8:18] + + } + return "Histogram_count_Which(" + strconv.FormatUint(uint64(w), 10) + ")" +} + +type Histogram_zeroCount_Which uint16 + +const ( + Histogram_zeroCount_Which_zeroCountInt Histogram_zeroCount_Which = 0 + Histogram_zeroCount_Which_zeroCountFloat Histogram_zeroCount_Which = 1 +) + +func (w Histogram_zeroCount_Which) String() string { + const s = "zeroCountIntzeroCountFloat" + switch w { + case Histogram_zeroCount_Which_zeroCountInt: + return s[0:12] + case Histogram_zeroCount_Which_zeroCountFloat: + return s[12:26] + + } + return "Histogram_zeroCount_Which(" + strconv.FormatUint(uint64(w), 10) + ")" +} + +// Histogram_TypeID is the unique identifier for the type Histogram. +const Histogram_TypeID = 0xc4dd3c458256382a + +func NewHistogram(s *capnp.Segment) (Histogram, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 56, PointerCount: 6}) + return Histogram(st), err +} + +func NewRootHistogram(s *capnp.Segment) (Histogram, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 56, PointerCount: 6}) + return Histogram(st), err +} + +func ReadRootHistogram(msg *capnp.Message) (Histogram, error) { + root, err := msg.Root() + return Histogram(root.Struct()), err +} + +func (s Histogram) String() string { + str, _ := text.Marshal(0xc4dd3c458256382a, capnp.Struct(s)) + return str +} + +func (s Histogram) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (Histogram) DecodeFromPtr(p capnp.Ptr) Histogram { + return Histogram(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s Histogram) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s Histogram) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Histogram) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Histogram) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Histogram) Count() Histogram_count { return Histogram_count(s) } + +func (s Histogram_count) Which() Histogram_count_Which { + return Histogram_count_Which(capnp.Struct(s).Uint16(8)) +} +func (s Histogram_count) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Histogram_count) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Histogram_count) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Histogram_count) CountInt() uint64 { + if capnp.Struct(s).Uint16(8) != 0 { + panic("Which() != countInt") + } + return capnp.Struct(s).Uint64(0) +} + +func (s Histogram_count) SetCountInt(v uint64) { + capnp.Struct(s).SetUint16(8, 0) + capnp.Struct(s).SetUint64(0, v) +} + +func (s Histogram_count) CountFloat() float64 { + if capnp.Struct(s).Uint16(8) != 1 { + panic("Which() != countFloat") + } + return math.Float64frombits(capnp.Struct(s).Uint64(0)) +} + +func (s Histogram_count) SetCountFloat(v float64) { + capnp.Struct(s).SetUint16(8, 1) + capnp.Struct(s).SetUint64(0, math.Float64bits(v)) +} + +func (s Histogram) Sum() float64 { + return math.Float64frombits(capnp.Struct(s).Uint64(16)) +} + +func (s Histogram) SetSum(v float64) { + capnp.Struct(s).SetUint64(16, math.Float64bits(v)) +} + +func (s Histogram) Schema() int32 { + return int32(capnp.Struct(s).Uint32(12)) +} + +func (s Histogram) SetSchema(v int32) { + capnp.Struct(s).SetUint32(12, uint32(v)) +} + +func (s Histogram) ZeroThreshold() float64 { + return math.Float64frombits(capnp.Struct(s).Uint64(24)) +} + +func (s Histogram) SetZeroThreshold(v float64) { + capnp.Struct(s).SetUint64(24, math.Float64bits(v)) +} + +func (s Histogram) ZeroCount() Histogram_zeroCount { return Histogram_zeroCount(s) } + +func (s Histogram_zeroCount) Which() Histogram_zeroCount_Which { + return Histogram_zeroCount_Which(capnp.Struct(s).Uint16(10)) +} +func (s Histogram_zeroCount) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Histogram_zeroCount) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Histogram_zeroCount) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Histogram_zeroCount) ZeroCountInt() uint64 { + if capnp.Struct(s).Uint16(10) != 0 { + panic("Which() != zeroCountInt") + } + return capnp.Struct(s).Uint64(32) +} + +func (s Histogram_zeroCount) SetZeroCountInt(v uint64) { + capnp.Struct(s).SetUint16(10, 0) + capnp.Struct(s).SetUint64(32, v) +} + +func (s Histogram_zeroCount) ZeroCountFloat() float64 { + if capnp.Struct(s).Uint16(10) != 1 { + panic("Which() != zeroCountFloat") + } + return math.Float64frombits(capnp.Struct(s).Uint64(32)) +} + +func (s Histogram_zeroCount) SetZeroCountFloat(v float64) { + capnp.Struct(s).SetUint16(10, 1) + capnp.Struct(s).SetUint64(32, math.Float64bits(v)) +} + +func (s Histogram) NegativeSpans() (BucketSpan_List, error) { + p, err := capnp.Struct(s).Ptr(0) + return BucketSpan_List(p.List()), err +} + +func (s Histogram) HasNegativeSpans() bool { + return capnp.Struct(s).HasPtr(0) +} + +func (s Histogram) SetNegativeSpans(v BucketSpan_List) error { + return capnp.Struct(s).SetPtr(0, v.ToPtr()) +} + +// NewNegativeSpans sets the negativeSpans field to a newly +// allocated BucketSpan_List, preferring placement in s's segment. +func (s Histogram) NewNegativeSpans(n int32) (BucketSpan_List, error) { + l, err := NewBucketSpan_List(capnp.Struct(s).Segment(), n) + if err != nil { + return BucketSpan_List{}, err + } + err = capnp.Struct(s).SetPtr(0, l.ToPtr()) + return l, err +} +func (s Histogram) NegativeDeltas() (capnp.Int64List, error) { + p, err := capnp.Struct(s).Ptr(1) + return capnp.Int64List(p.List()), err +} + +func (s Histogram) HasNegativeDeltas() bool { + return capnp.Struct(s).HasPtr(1) +} + +func (s Histogram) SetNegativeDeltas(v capnp.Int64List) error { + return capnp.Struct(s).SetPtr(1, v.ToPtr()) +} + +// NewNegativeDeltas sets the negativeDeltas field to a newly +// allocated capnp.Int64List, preferring placement in s's segment. +func (s Histogram) NewNegativeDeltas(n int32) (capnp.Int64List, error) { + l, err := capnp.NewInt64List(capnp.Struct(s).Segment(), n) + if err != nil { + return capnp.Int64List{}, err + } + err = capnp.Struct(s).SetPtr(1, l.ToPtr()) + return l, err +} +func (s Histogram) NegativeCounts() (capnp.Float64List, error) { + p, err := capnp.Struct(s).Ptr(2) + return capnp.Float64List(p.List()), err +} + +func (s Histogram) HasNegativeCounts() bool { + return capnp.Struct(s).HasPtr(2) +} + +func (s Histogram) SetNegativeCounts(v capnp.Float64List) error { + return capnp.Struct(s).SetPtr(2, v.ToPtr()) +} + +// NewNegativeCounts sets the negativeCounts field to a newly +// allocated capnp.Float64List, preferring placement in s's segment. +func (s Histogram) NewNegativeCounts(n int32) (capnp.Float64List, error) { + l, err := capnp.NewFloat64List(capnp.Struct(s).Segment(), n) + if err != nil { + return capnp.Float64List{}, err + } + err = capnp.Struct(s).SetPtr(2, l.ToPtr()) + return l, err +} +func (s Histogram) PositiveSpans() (BucketSpan_List, error) { + p, err := capnp.Struct(s).Ptr(3) + return BucketSpan_List(p.List()), err +} + +func (s Histogram) HasPositiveSpans() bool { + return capnp.Struct(s).HasPtr(3) +} + +func (s Histogram) SetPositiveSpans(v BucketSpan_List) error { + return capnp.Struct(s).SetPtr(3, v.ToPtr()) +} + +// NewPositiveSpans sets the positiveSpans field to a newly +// allocated BucketSpan_List, preferring placement in s's segment. +func (s Histogram) NewPositiveSpans(n int32) (BucketSpan_List, error) { + l, err := NewBucketSpan_List(capnp.Struct(s).Segment(), n) + if err != nil { + return BucketSpan_List{}, err + } + err = capnp.Struct(s).SetPtr(3, l.ToPtr()) + return l, err +} +func (s Histogram) PositiveDeltas() (capnp.Int64List, error) { + p, err := capnp.Struct(s).Ptr(4) + return capnp.Int64List(p.List()), err +} + +func (s Histogram) HasPositiveDeltas() bool { + return capnp.Struct(s).HasPtr(4) +} + +func (s Histogram) SetPositiveDeltas(v capnp.Int64List) error { + return capnp.Struct(s).SetPtr(4, v.ToPtr()) +} + +// NewPositiveDeltas sets the positiveDeltas field to a newly +// allocated capnp.Int64List, preferring placement in s's segment. +func (s Histogram) NewPositiveDeltas(n int32) (capnp.Int64List, error) { + l, err := capnp.NewInt64List(capnp.Struct(s).Segment(), n) + if err != nil { + return capnp.Int64List{}, err + } + err = capnp.Struct(s).SetPtr(4, l.ToPtr()) + return l, err +} +func (s Histogram) PositiveCounts() (capnp.Float64List, error) { + p, err := capnp.Struct(s).Ptr(5) + return capnp.Float64List(p.List()), err +} + +func (s Histogram) HasPositiveCounts() bool { + return capnp.Struct(s).HasPtr(5) +} + +func (s Histogram) SetPositiveCounts(v capnp.Float64List) error { + return capnp.Struct(s).SetPtr(5, v.ToPtr()) +} + +// NewPositiveCounts sets the positiveCounts field to a newly +// allocated capnp.Float64List, preferring placement in s's segment. +func (s Histogram) NewPositiveCounts(n int32) (capnp.Float64List, error) { + l, err := capnp.NewFloat64List(capnp.Struct(s).Segment(), n) + if err != nil { + return capnp.Float64List{}, err + } + err = capnp.Struct(s).SetPtr(5, l.ToPtr()) + return l, err +} +func (s Histogram) ResetHint() Histogram_ResetHint { + return Histogram_ResetHint(capnp.Struct(s).Uint16(40)) +} + +func (s Histogram) SetResetHint(v Histogram_ResetHint) { + capnp.Struct(s).SetUint16(40, uint16(v)) +} + +func (s Histogram) Timestamp() int64 { + return int64(capnp.Struct(s).Uint64(48)) +} + +func (s Histogram) SetTimestamp(v int64) { + capnp.Struct(s).SetUint64(48, uint64(v)) +} + +// Histogram_List is a list of Histogram. +type Histogram_List = capnp.StructList[Histogram] + +// NewHistogram creates a new list of Histogram. +func NewHistogram_List(s *capnp.Segment, sz int32) (Histogram_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 56, PointerCount: 6}, sz) + return capnp.StructList[Histogram](l), err +} + +// Histogram_Future is a wrapper for a Histogram promised by a client call. +type Histogram_Future struct{ *capnp.Future } + +func (f Histogram_Future) Struct() (Histogram, error) { + p, err := f.Future.Ptr() + return Histogram(p.Struct()), err +} +func (p Histogram_Future) Count() Histogram_count_Future { return Histogram_count_Future{p.Future} } + +// Histogram_count_Future is a wrapper for a Histogram_count promised by a client call. +type Histogram_count_Future struct{ *capnp.Future } + +func (f Histogram_count_Future) Struct() (Histogram_count, error) { + p, err := f.Future.Ptr() + return Histogram_count(p.Struct()), err +} +func (p Histogram_Future) ZeroCount() Histogram_zeroCount_Future { + return Histogram_zeroCount_Future{p.Future} +} + +// Histogram_zeroCount_Future is a wrapper for a Histogram_zeroCount promised by a client call. +type Histogram_zeroCount_Future struct{ *capnp.Future } + +func (f Histogram_zeroCount_Future) Struct() (Histogram_zeroCount, error) { + p, err := f.Future.Ptr() + return Histogram_zeroCount(p.Struct()), err +} + +type Histogram_ResetHint uint16 + +// Histogram_ResetHint_TypeID is the unique identifier for the type Histogram_ResetHint. +const Histogram_ResetHint_TypeID = 0xd5b0cec646441eb0 + +// Values of Histogram_ResetHint. +const ( + Histogram_ResetHint_unknown Histogram_ResetHint = 0 + Histogram_ResetHint_yes Histogram_ResetHint = 1 + Histogram_ResetHint_no Histogram_ResetHint = 2 + Histogram_ResetHint_gauge Histogram_ResetHint = 3 +) + +// String returns the enum's constant name. +func (c Histogram_ResetHint) String() string { + switch c { + case Histogram_ResetHint_unknown: + return "unknown" + case Histogram_ResetHint_yes: + return "yes" + case Histogram_ResetHint_no: + return "no" + case Histogram_ResetHint_gauge: + return "gauge" + + default: + return "" + } +} + +// Histogram_ResetHintFromString returns the enum value with a name, +// or the zero value if there's no such value. +func Histogram_ResetHintFromString(c string) Histogram_ResetHint { + switch c { + case "unknown": + return Histogram_ResetHint_unknown + case "yes": + return Histogram_ResetHint_yes + case "no": + return Histogram_ResetHint_no + case "gauge": + return Histogram_ResetHint_gauge + + default: + return 0 + } +} + +type Histogram_ResetHint_List = capnp.EnumList[Histogram_ResetHint] + +func NewHistogram_ResetHint_List(s *capnp.Segment, sz int32) (Histogram_ResetHint_List, error) { + return capnp.NewEnumList[Histogram_ResetHint](s, sz) +} + +type Exemplar capnp.Struct + +// Exemplar_TypeID is the unique identifier for the type Exemplar. +const Exemplar_TypeID = 0xbd820120399954be + +func NewExemplar(s *capnp.Segment) (Exemplar, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 16, PointerCount: 1}) + return Exemplar(st), err +} + +func NewRootExemplar(s *capnp.Segment) (Exemplar, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 16, PointerCount: 1}) + return Exemplar(st), err +} + +func ReadRootExemplar(msg *capnp.Message) (Exemplar, error) { + root, err := msg.Root() + return Exemplar(root.Struct()), err +} + +func (s Exemplar) String() string { + str, _ := text.Marshal(0xbd820120399954be, capnp.Struct(s)) + return str +} + +func (s Exemplar) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (Exemplar) DecodeFromPtr(p capnp.Ptr) Exemplar { + return Exemplar(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s Exemplar) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s Exemplar) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Exemplar) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Exemplar) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Exemplar) Labels() (Label_List, error) { + p, err := capnp.Struct(s).Ptr(0) + return Label_List(p.List()), err +} + +func (s Exemplar) HasLabels() bool { + return capnp.Struct(s).HasPtr(0) +} + +func (s Exemplar) SetLabels(v Label_List) error { + return capnp.Struct(s).SetPtr(0, v.ToPtr()) +} + +// NewLabels sets the labels field to a newly +// allocated Label_List, preferring placement in s's segment. +func (s Exemplar) NewLabels(n int32) (Label_List, error) { + l, err := NewLabel_List(capnp.Struct(s).Segment(), n) + if err != nil { + return Label_List{}, err + } + err = capnp.Struct(s).SetPtr(0, l.ToPtr()) + return l, err +} +func (s Exemplar) Value() float64 { + return math.Float64frombits(capnp.Struct(s).Uint64(0)) +} + +func (s Exemplar) SetValue(v float64) { + capnp.Struct(s).SetUint64(0, math.Float64bits(v)) +} + +func (s Exemplar) Timestamp() int64 { + return int64(capnp.Struct(s).Uint64(8)) +} + +func (s Exemplar) SetTimestamp(v int64) { + capnp.Struct(s).SetUint64(8, uint64(v)) +} + +// Exemplar_List is a list of Exemplar. +type Exemplar_List = capnp.StructList[Exemplar] + +// NewExemplar creates a new list of Exemplar. +func NewExemplar_List(s *capnp.Segment, sz int32) (Exemplar_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 16, PointerCount: 1}, sz) + return capnp.StructList[Exemplar](l), err +} + +// Exemplar_Future is a wrapper for a Exemplar promised by a client call. +type Exemplar_Future struct{ *capnp.Future } + +func (f Exemplar_Future) Struct() (Exemplar, error) { + p, err := f.Future.Ptr() + return Exemplar(p.Struct()), err +} + +type TimeSeries capnp.Struct + +// TimeSeries_TypeID is the unique identifier for the type TimeSeries. +const TimeSeries_TypeID = 0xb438c10228b97446 + +func NewTimeSeries(s *capnp.Segment) (TimeSeries, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 4}) + return TimeSeries(st), err +} + +func NewRootTimeSeries(s *capnp.Segment) (TimeSeries, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 4}) + return TimeSeries(st), err +} + +func ReadRootTimeSeries(msg *capnp.Message) (TimeSeries, error) { + root, err := msg.Root() + return TimeSeries(root.Struct()), err +} + +func (s TimeSeries) String() string { + str, _ := text.Marshal(0xb438c10228b97446, capnp.Struct(s)) + return str +} + +func (s TimeSeries) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (TimeSeries) DecodeFromPtr(p capnp.Ptr) TimeSeries { + return TimeSeries(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s TimeSeries) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s TimeSeries) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s TimeSeries) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s TimeSeries) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s TimeSeries) Labels() (Label_List, error) { + p, err := capnp.Struct(s).Ptr(0) + return Label_List(p.List()), err +} + +func (s TimeSeries) HasLabels() bool { + return capnp.Struct(s).HasPtr(0) +} + +func (s TimeSeries) SetLabels(v Label_List) error { + return capnp.Struct(s).SetPtr(0, v.ToPtr()) +} + +// NewLabels sets the labels field to a newly +// allocated Label_List, preferring placement in s's segment. +func (s TimeSeries) NewLabels(n int32) (Label_List, error) { + l, err := NewLabel_List(capnp.Struct(s).Segment(), n) + if err != nil { + return Label_List{}, err + } + err = capnp.Struct(s).SetPtr(0, l.ToPtr()) + return l, err +} +func (s TimeSeries) Samples() (Sample_List, error) { + p, err := capnp.Struct(s).Ptr(1) + return Sample_List(p.List()), err +} + +func (s TimeSeries) HasSamples() bool { + return capnp.Struct(s).HasPtr(1) +} + +func (s TimeSeries) SetSamples(v Sample_List) error { + return capnp.Struct(s).SetPtr(1, v.ToPtr()) +} + +// NewSamples sets the samples field to a newly +// allocated Sample_List, preferring placement in s's segment. +func (s TimeSeries) NewSamples(n int32) (Sample_List, error) { + l, err := NewSample_List(capnp.Struct(s).Segment(), n) + if err != nil { + return Sample_List{}, err + } + err = capnp.Struct(s).SetPtr(1, l.ToPtr()) + return l, err +} +func (s TimeSeries) Histograms() (Histogram_List, error) { + p, err := capnp.Struct(s).Ptr(2) + return Histogram_List(p.List()), err +} + +func (s TimeSeries) HasHistograms() bool { + return capnp.Struct(s).HasPtr(2) +} + +func (s TimeSeries) SetHistograms(v Histogram_List) error { + return capnp.Struct(s).SetPtr(2, v.ToPtr()) +} + +// NewHistograms sets the histograms field to a newly +// allocated Histogram_List, preferring placement in s's segment. +func (s TimeSeries) NewHistograms(n int32) (Histogram_List, error) { + l, err := NewHistogram_List(capnp.Struct(s).Segment(), n) + if err != nil { + return Histogram_List{}, err + } + err = capnp.Struct(s).SetPtr(2, l.ToPtr()) + return l, err +} +func (s TimeSeries) Exemplars() (Exemplar_List, error) { + p, err := capnp.Struct(s).Ptr(3) + return Exemplar_List(p.List()), err +} + +func (s TimeSeries) HasExemplars() bool { + return capnp.Struct(s).HasPtr(3) +} + +func (s TimeSeries) SetExemplars(v Exemplar_List) error { + return capnp.Struct(s).SetPtr(3, v.ToPtr()) +} + +// NewExemplars sets the exemplars field to a newly +// allocated Exemplar_List, preferring placement in s's segment. +func (s TimeSeries) NewExemplars(n int32) (Exemplar_List, error) { + l, err := NewExemplar_List(capnp.Struct(s).Segment(), n) + if err != nil { + return Exemplar_List{}, err + } + err = capnp.Struct(s).SetPtr(3, l.ToPtr()) + return l, err +} + +// TimeSeries_List is a list of TimeSeries. +type TimeSeries_List = capnp.StructList[TimeSeries] + +// NewTimeSeries creates a new list of TimeSeries. +func NewTimeSeries_List(s *capnp.Segment, sz int32) (TimeSeries_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 4}, sz) + return capnp.StructList[TimeSeries](l), err +} + +// TimeSeries_Future is a wrapper for a TimeSeries promised by a client call. +type TimeSeries_Future struct{ *capnp.Future } + +func (f TimeSeries_Future) Struct() (TimeSeries, error) { + p, err := f.Future.Ptr() + return TimeSeries(p.Struct()), err +} + +type WriteRequest capnp.Struct + +// WriteRequest_TypeID is the unique identifier for the type WriteRequest. +const WriteRequest_TypeID = 0xeb3bcb770c8eb6be + +func NewWriteRequest(s *capnp.Segment) (WriteRequest, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3}) + return WriteRequest(st), err +} + +func NewRootWriteRequest(s *capnp.Segment) (WriteRequest, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3}) + return WriteRequest(st), err +} + +func ReadRootWriteRequest(msg *capnp.Message) (WriteRequest, error) { + root, err := msg.Root() + return WriteRequest(root.Struct()), err +} + +func (s WriteRequest) String() string { + str, _ := text.Marshal(0xeb3bcb770c8eb6be, capnp.Struct(s)) + return str +} + +func (s WriteRequest) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (WriteRequest) DecodeFromPtr(p capnp.Ptr) WriteRequest { + return WriteRequest(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s WriteRequest) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s WriteRequest) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s WriteRequest) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s WriteRequest) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s WriteRequest) Symbols() (Symbols, error) { + p, err := capnp.Struct(s).Ptr(0) + return Symbols(p.Struct()), err +} + +func (s WriteRequest) HasSymbols() bool { + return capnp.Struct(s).HasPtr(0) +} + +func (s WriteRequest) SetSymbols(v Symbols) error { + return capnp.Struct(s).SetPtr(0, capnp.Struct(v).ToPtr()) +} + +// NewSymbols sets the symbols field to a newly +// allocated Symbols struct, preferring placement in s's segment. +func (s WriteRequest) NewSymbols() (Symbols, error) { + ss, err := NewSymbols(capnp.Struct(s).Segment()) + if err != nil { + return Symbols{}, err + } + err = capnp.Struct(s).SetPtr(0, capnp.Struct(ss).ToPtr()) + return ss, err +} + +func (s WriteRequest) TimeSeries() (TimeSeries_List, error) { + p, err := capnp.Struct(s).Ptr(1) + return TimeSeries_List(p.List()), err +} + +func (s WriteRequest) HasTimeSeries() bool { + return capnp.Struct(s).HasPtr(1) +} + +func (s WriteRequest) SetTimeSeries(v TimeSeries_List) error { + return capnp.Struct(s).SetPtr(1, v.ToPtr()) +} + +// NewTimeSeries sets the timeSeries field to a newly +// allocated TimeSeries_List, preferring placement in s's segment. +func (s WriteRequest) NewTimeSeries(n int32) (TimeSeries_List, error) { + l, err := NewTimeSeries_List(capnp.Struct(s).Segment(), n) + if err != nil { + return TimeSeries_List{}, err + } + err = capnp.Struct(s).SetPtr(1, l.ToPtr()) + return l, err +} +func (s WriteRequest) Tenant() (string, error) { + p, err := capnp.Struct(s).Ptr(2) + return p.Text(), err +} + +func (s WriteRequest) HasTenant() bool { + return capnp.Struct(s).HasPtr(2) +} + +func (s WriteRequest) TenantBytes() ([]byte, error) { + p, err := capnp.Struct(s).Ptr(2) + return p.TextBytes(), err +} + +func (s WriteRequest) SetTenant(v string) error { + return capnp.Struct(s).SetText(2, v) +} + +// WriteRequest_List is a list of WriteRequest. +type WriteRequest_List = capnp.StructList[WriteRequest] + +// NewWriteRequest creates a new list of WriteRequest. +func NewWriteRequest_List(s *capnp.Segment, sz int32) (WriteRequest_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 3}, sz) + return capnp.StructList[WriteRequest](l), err +} + +// WriteRequest_Future is a wrapper for a WriteRequest promised by a client call. +type WriteRequest_Future struct{ *capnp.Future } + +func (f WriteRequest_Future) Struct() (WriteRequest, error) { + p, err := f.Future.Ptr() + return WriteRequest(p.Struct()), err +} +func (p WriteRequest_Future) Symbols() Symbols_Future { + return Symbols_Future{Future: p.Future.Field(0, nil)} +} + +type WriteError uint16 + +// WriteError_TypeID is the unique identifier for the type WriteError. +const WriteError_TypeID = 0xe67be4164a39ea55 + +// Values of WriteError. +const ( + WriteError_none WriteError = 0 + WriteError_unavailable WriteError = 1 + WriteError_alreadyExists WriteError = 2 + WriteError_invalidArgument WriteError = 3 + WriteError_internal WriteError = 4 +) + +// String returns the enum's constant name. +func (c WriteError) String() string { + switch c { + case WriteError_none: + return "none" + case WriteError_unavailable: + return "unavailable" + case WriteError_alreadyExists: + return "alreadyExists" + case WriteError_invalidArgument: + return "invalidArgument" + case WriteError_internal: + return "internal" + + default: + return "" + } +} + +// WriteErrorFromString returns the enum value with a name, +// or the zero value if there's no such value. +func WriteErrorFromString(c string) WriteError { + switch c { + case "none": + return WriteError_none + case "unavailable": + return WriteError_unavailable + case "alreadyExists": + return WriteError_alreadyExists + case "invalidArgument": + return WriteError_invalidArgument + case "internal": + return WriteError_internal + + default: + return 0 + } +} + +type WriteError_List = capnp.EnumList[WriteError] + +func NewWriteError_List(s *capnp.Segment, sz int32) (WriteError_List, error) { + return capnp.NewEnumList[WriteError](s, sz) +} + +type Writer capnp.Client + +// Writer_TypeID is the unique identifier for the type Writer. +const Writer_TypeID = 0xcc20b9c332c83b91 + +func (c Writer) Write(ctx context.Context, params func(Writer_write_Params) error) (Writer_write_Results_Future, capnp.ReleaseFunc) { + + s := capnp.Send{ + Method: capnp.Method{ + InterfaceID: 0xcc20b9c332c83b91, + MethodID: 0, + InterfaceName: "pkg/receive/writecapnp/write_request.capnp:Writer", + MethodName: "write", + }, + } + if params != nil { + s.ArgsSize = capnp.ObjectSize{DataSize: 0, PointerCount: 1} + s.PlaceArgs = func(s capnp.Struct) error { return params(Writer_write_Params(s)) } + } + + ans, release := capnp.Client(c).SendCall(ctx, s) + return Writer_write_Results_Future{Future: ans.Future()}, release + +} + +func (c Writer) WaitStreaming() error { + return capnp.Client(c).WaitStreaming() +} + +// String returns a string that identifies this capability for debugging +// purposes. Its format should not be depended on: in particular, it +// should not be used to compare clients. Use IsSame to compare clients +// for equality. +func (c Writer) String() string { + return "Writer(" + capnp.Client(c).String() + ")" +} + +// AddRef creates a new Client that refers to the same capability as c. +// If c is nil or has resolved to null, then AddRef returns nil. +func (c Writer) AddRef() Writer { + return Writer(capnp.Client(c).AddRef()) +} + +// Release releases a capability reference. If this is the last +// reference to the capability, then the underlying resources associated +// with the capability will be released. +// +// Release will panic if c has already been released, but not if c is +// nil or resolved to null. +func (c Writer) Release() { + capnp.Client(c).Release() +} + +// Resolve blocks until the capability is fully resolved or the Context +// expires. +func (c Writer) Resolve(ctx context.Context) error { + return capnp.Client(c).Resolve(ctx) +} + +func (c Writer) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Client(c).EncodeAsPtr(seg) +} + +func (Writer) DecodeFromPtr(p capnp.Ptr) Writer { + return Writer(capnp.Client{}.DecodeFromPtr(p)) +} + +// IsValid reports whether c is a valid reference to a capability. +// A reference is invalid if it is nil, has resolved to null, or has +// been released. +func (c Writer) IsValid() bool { + return capnp.Client(c).IsValid() +} + +// IsSame reports whether c and other refer to a capability created by the +// same call to NewClient. This can return false negatives if c or other +// are not fully resolved: use Resolve if this is an issue. If either +// c or other are released, then IsSame panics. +func (c Writer) IsSame(other Writer) bool { + return capnp.Client(c).IsSame(capnp.Client(other)) +} + +// Update the flowcontrol.FlowLimiter used to manage flow control for +// this client. This affects all future calls, but not calls already +// waiting to send. Passing nil sets the value to flowcontrol.NopLimiter, +// which is also the default. +func (c Writer) SetFlowLimiter(lim fc.FlowLimiter) { + capnp.Client(c).SetFlowLimiter(lim) +} + +// Get the current flowcontrol.FlowLimiter used to manage flow control +// for this client. +func (c Writer) GetFlowLimiter() fc.FlowLimiter { + return capnp.Client(c).GetFlowLimiter() +} + +// A Writer_Server is a Writer with a local implementation. +type Writer_Server interface { + Write(context.Context, Writer_write) error +} + +// Writer_NewServer creates a new Server from an implementation of Writer_Server. +func Writer_NewServer(s Writer_Server) *server.Server { + c, _ := s.(server.Shutdowner) + return server.New(Writer_Methods(nil, s), s, c) +} + +// Writer_ServerToClient creates a new Client from an implementation of Writer_Server. +// The caller is responsible for calling Release on the returned Client. +func Writer_ServerToClient(s Writer_Server) Writer { + return Writer(capnp.NewClient(Writer_NewServer(s))) +} + +// Writer_Methods appends Methods to a slice that invoke the methods on s. +// This can be used to create a more complicated Server. +func Writer_Methods(methods []server.Method, s Writer_Server) []server.Method { + if cap(methods) == 0 { + methods = make([]server.Method, 0, 1) + } + + methods = append(methods, server.Method{ + Method: capnp.Method{ + InterfaceID: 0xcc20b9c332c83b91, + MethodID: 0, + InterfaceName: "pkg/receive/writecapnp/write_request.capnp:Writer", + MethodName: "write", + }, + Impl: func(ctx context.Context, call *server.Call) error { + return s.Write(ctx, Writer_write{call}) + }, + }) + + return methods +} + +// Writer_write holds the state for a server call to Writer.write. +// See server.Call for documentation. +type Writer_write struct { + *server.Call +} + +// Args returns the call's arguments. +func (c Writer_write) Args() Writer_write_Params { + return Writer_write_Params(c.Call.Args()) +} + +// AllocResults allocates the results struct. +func (c Writer_write) AllocResults() (Writer_write_Results, error) { + r, err := c.Call.AllocResults(capnp.ObjectSize{DataSize: 8, PointerCount: 0}) + return Writer_write_Results(r), err +} + +// Writer_List is a list of Writer. +type Writer_List = capnp.CapList[Writer] + +// NewWriter_List creates a new list of Writer. +func NewWriter_List(s *capnp.Segment, sz int32) (Writer_List, error) { + l, err := capnp.NewPointerList(s, sz) + return capnp.CapList[Writer](l), err +} + +type Writer_write_Params capnp.Struct + +// Writer_write_Params_TypeID is the unique identifier for the type Writer_write_Params. +const Writer_write_Params_TypeID = 0x90d5073324ecc34b + +func NewWriter_write_Params(s *capnp.Segment) (Writer_write_Params, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}) + return Writer_write_Params(st), err +} + +func NewRootWriter_write_Params(s *capnp.Segment) (Writer_write_Params, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}) + return Writer_write_Params(st), err +} + +func ReadRootWriter_write_Params(msg *capnp.Message) (Writer_write_Params, error) { + root, err := msg.Root() + return Writer_write_Params(root.Struct()), err +} + +func (s Writer_write_Params) String() string { + str, _ := text.Marshal(0x90d5073324ecc34b, capnp.Struct(s)) + return str +} + +func (s Writer_write_Params) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (Writer_write_Params) DecodeFromPtr(p capnp.Ptr) Writer_write_Params { + return Writer_write_Params(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s Writer_write_Params) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s Writer_write_Params) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Writer_write_Params) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Writer_write_Params) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Writer_write_Params) Wr() (WriteRequest, error) { + p, err := capnp.Struct(s).Ptr(0) + return WriteRequest(p.Struct()), err +} + +func (s Writer_write_Params) HasWr() bool { + return capnp.Struct(s).HasPtr(0) +} + +func (s Writer_write_Params) SetWr(v WriteRequest) error { + return capnp.Struct(s).SetPtr(0, capnp.Struct(v).ToPtr()) +} + +// NewWr sets the wr field to a newly +// allocated WriteRequest struct, preferring placement in s's segment. +func (s Writer_write_Params) NewWr() (WriteRequest, error) { + ss, err := NewWriteRequest(capnp.Struct(s).Segment()) + if err != nil { + return WriteRequest{}, err + } + err = capnp.Struct(s).SetPtr(0, capnp.Struct(ss).ToPtr()) + return ss, err +} + +// Writer_write_Params_List is a list of Writer_write_Params. +type Writer_write_Params_List = capnp.StructList[Writer_write_Params] + +// NewWriter_write_Params creates a new list of Writer_write_Params. +func NewWriter_write_Params_List(s *capnp.Segment, sz int32) (Writer_write_Params_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 0, PointerCount: 1}, sz) + return capnp.StructList[Writer_write_Params](l), err +} + +// Writer_write_Params_Future is a wrapper for a Writer_write_Params promised by a client call. +type Writer_write_Params_Future struct{ *capnp.Future } + +func (f Writer_write_Params_Future) Struct() (Writer_write_Params, error) { + p, err := f.Future.Ptr() + return Writer_write_Params(p.Struct()), err +} +func (p Writer_write_Params_Future) Wr() WriteRequest_Future { + return WriteRequest_Future{Future: p.Future.Field(0, nil)} +} + +type Writer_write_Results capnp.Struct + +// Writer_write_Results_TypeID is the unique identifier for the type Writer_write_Results. +const Writer_write_Results_TypeID = 0x87f6d2196d414cf4 + +func NewWriter_write_Results(s *capnp.Segment) (Writer_write_Results, error) { + st, err := capnp.NewStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}) + return Writer_write_Results(st), err +} + +func NewRootWriter_write_Results(s *capnp.Segment) (Writer_write_Results, error) { + st, err := capnp.NewRootStruct(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}) + return Writer_write_Results(st), err +} + +func ReadRootWriter_write_Results(msg *capnp.Message) (Writer_write_Results, error) { + root, err := msg.Root() + return Writer_write_Results(root.Struct()), err +} + +func (s Writer_write_Results) String() string { + str, _ := text.Marshal(0x87f6d2196d414cf4, capnp.Struct(s)) + return str +} + +func (s Writer_write_Results) EncodeAsPtr(seg *capnp.Segment) capnp.Ptr { + return capnp.Struct(s).EncodeAsPtr(seg) +} + +func (Writer_write_Results) DecodeFromPtr(p capnp.Ptr) Writer_write_Results { + return Writer_write_Results(capnp.Struct{}.DecodeFromPtr(p)) +} + +func (s Writer_write_Results) ToPtr() capnp.Ptr { + return capnp.Struct(s).ToPtr() +} +func (s Writer_write_Results) IsValid() bool { + return capnp.Struct(s).IsValid() +} + +func (s Writer_write_Results) Message() *capnp.Message { + return capnp.Struct(s).Message() +} + +func (s Writer_write_Results) Segment() *capnp.Segment { + return capnp.Struct(s).Segment() +} +func (s Writer_write_Results) Error() WriteError { + return WriteError(capnp.Struct(s).Uint16(0)) +} + +func (s Writer_write_Results) SetError(v WriteError) { + capnp.Struct(s).SetUint16(0, uint16(v)) +} + +// Writer_write_Results_List is a list of Writer_write_Results. +type Writer_write_Results_List = capnp.StructList[Writer_write_Results] + +// NewWriter_write_Results creates a new list of Writer_write_Results. +func NewWriter_write_Results_List(s *capnp.Segment, sz int32) (Writer_write_Results_List, error) { + l, err := capnp.NewCompositeList(s, capnp.ObjectSize{DataSize: 8, PointerCount: 0}, sz) + return capnp.StructList[Writer_write_Results](l), err +} + +// Writer_write_Results_Future is a wrapper for a Writer_write_Results promised by a client call. +type Writer_write_Results_Future struct{ *capnp.Future } + +func (f Writer_write_Results_Future) Struct() (Writer_write_Results, error) { + p, err := f.Future.Ptr() + return Writer_write_Results(p.Struct()), err +} + +const schema_85d3acc39d94e0f8 = "x\xda\xa4Vml\x1cW\x15\xbd\xe7\xbd\x99\x1d\xdb\xbb" + + "\x8e=\x9aUQ*`\xdb*HuL\xd2\xc4NP" + + "\x92\x16m\x1c\xe2\x10\xa7F\xf2\xec&\xd0\xa0\x14:\xb1" + + "_\xed%\xb3\xb3\xdb\x99Y;6\xaa\x0c\x91P\x13T" + + ">\x1a\x88DAH\x0d\x14$\xbe\xab\xf0\xa1Fj\x91" + + " \x08\xa8\xf8P\x0bT\x02D)\x95*\x90 \x80\x90" + + "\x10B\x91\xc8\xa0\xfbv=;XFd\xc3?\xfb\xcc" + + "\xd9{\xde=\xef\xbe{\xef\x8ekr\xbf\xb1s\xf0#" + + "9\x12\xee\xb4\x99K\xfe>=Q\xdf\xfc\xb3\x7fV`\x97\xc7\xee\xb5\xad\xbf\xfc" + + "\xe0\xfc\xdf6\xaa\x8bo\x16>\x08\xe7'\x9a\xfc\\a" + + "\x89\xb6%\xcdS\xf3w\x85jVY\xb5Eu\xd7R" + + "X\x8b\xd5\xac\xd7\x0c\x9a\xed?\xdf\x1d\xaa\x87Z*\x8a" + + "\xb7kl\xdf;\x18\x0b\xb7\xebO[**j\xf9q" + + "D\xae!\x0d\"\x03D\xf6\xe0\x18\x91\xdb'\xe1\x16\x05" + + "J*\x0c\x1b!\x86\xba\x8e\x100DH\x05s\xbd\x0a" + + "\x96g\xbc\xd0\xabGY\xbd[\xbbzr)\xc4p\xd7" + + "T\x02\x863b\xe6\x0d\x88\x1dh\xcd\x9eR\xa5\xb8\xda" + + "\xf4\x82\x19\xc0\xedKeF\xf6\x11\xb9[$\xdc\x1d\x02" + + "6P\xe4\xe7joc\xf0N\x09w\x97@\xb9\xf1\xe0" + + "\x83\x91\x8aa\x90\x80A(\xfb*\x98\x8f\x17\xd0G\x02" + + "}=f|\xb8\x16\xc5\x8d\xf9\xd0\xabo\x9fm\xb4d" + + "\x10\xf31\x0aI\xd2>\xc7\x91\xae\xe4 \xae'\xed\x83" + + "\xec|'\x91\xbbC\xc2\xbdG \x99m\xb4\x82x*" + + "\x88\x89\x08\xfd$\xd0O\x1d\xec\x90\xdf \xe9\xc5\xc8\x93" + + "@\xbeGc\xaa\xcb\xf5\x93\x0d\xe9G\xeb\\\xd9\xba\x91" + + "+\x07:G<(04\xe7\xc5\x1e\x06I`\x90\xb0" + + "\xda\xb6(\xc2&\xc2\x8c\x84\xf6f\xd3M{\xb3\xa2\xc2" + + "r\xe3-\x9c\x17\x1f\xe8\xb5Ib\x14a\xf2\x99\xde\xd3" + + "u\xe8u\xb8\xcep\x8e-Z\xc9X\xb4\xa2B\xfdS" + + "\x1ab\xa3R\x97R\xb8\xcc^\xdd\xa4SGkuU" + + "-\xa9\xb0\xa6\xb4Y\xc3\xa9Y\x1eW\xcb\x09\x09\xf7t" + + "\xc6\xac\x16\x9b\xd5\x94p\x1f\x15\xb0\x85(B\x10\xd9\xe7" + + "\xf8:\xcfJ\xb8O\x0a\xd8R\x16!\x89\xec\x8b\x15\"" + + "\xf7\x09\x09\xf7\x19\x81\xb2\xef\x9dT~j\xe4p\xf7\xb9" + + "\x13\x18\\\x8d\xbcz\xd3W\x19B\xda<\xda\x84d\xa1" + + "\xe3#\xc9z\x86\x95ik\x9a\xa5N\xabz\xd3\xf7B" + + "B\x86\x94\xf6\xe4\x0e\xa9\x17s&9\xa0\xe5{![" + + "SH\xad\x99dk\xf6K\xb8'\x04\xd6\x9c9\xce\x8d" + + "\xe4\xa8\x84\xfb\x00;\x83\xb63\xf7W:\x1e.\xfco" + + "\x13J\x8b\x9e\xdfR\xe9\x1d\xc6\xb5\xba\x8ab\xafNh" + + "\xc2$\x01\xb3\xc7\xa3\xeb\xca\x1b\xe2\xd2s\x0d 3\x0e" + + "PI**R\xf1\xe1Z@\x88\xdd]\x9c\x152\xc3" + + "\xd6\xb9\x1fc$l\xb4/\xd7\x99\xc4\x1dD\xd5\xfd\x90" + + "\xa8N\x83Sk\xdf\xaf3\x85}D\xd5\x83\x8c\xcf\xa0" + + "s\xef\x06\x91\xf36\x84D\xd5i\xc6\xef\x83\x00X<" + + "\x9d\xb7\xce1T8\x97\"\x0fDgBSu\xe8\x13" + + "\x1c\"\x87\"\xfa\x88\x9c\xe3X!\xaa\xde\xc7x\xcc\xb8" + + "%\x8a\xe8'r\x1e\xd2x\x93\xf1G\x19\xef\x93E\x0c" + + "\xf0\xec\xd5q\xce2\xfe$\xe3\xfdF\x11y\"\xe7\xa2" + + "\xe6?\xc1\xf83\x8c\x0f\x98E\x14x\xfaj\xfci\xc6" + + "\x7f\xc1x\xbeX\xc4 \x91\xf3\x02*D\xd5\xe7\x19\xff" + + "\x0d\xe3\x85\\\x11\x9b\x88\x9c_i\xfc\x97\x8c\xbf\x0a\x81" + + "\x92\xeeNV\xd4\xaa\xaf]V9\x9a]Puo\xad" + + "\x99\xea\x87yt!TT\x8a\x16\x1a\xfe\\z\xa7\xe9" + + "\x83E\x9c\x04j\xde\x8bk\x8b\x8aJ\xdc\xbd3e\x91" + + "\xaeH\x9dzM\x89\xe5\x83\xca\x8f\xbd\x94iv\xdaQ" + + "\xf7\xbb\xee.\xe9\xf7\xfcZ\xbbjD\xb5\x1b\x12J\x89" + + "\xffE\xa8\xfb}c\xa1\xb0[U\x18\xea\x16\\g\x86" + + "\xfe\xbf\xf5\xac\xe7*\xf4C4\xa4I\x94\xee\x9aX\xdb" + + "Jm\x9b\xeb\xd6\xb4J\xfa\xe7\xfb1\x83\x9b\xed\xd5\x15" + + "\x15\x95u*\xb1n\x89\xfa)\x8f\x1c\xe0L\xec\xdb\xef" + + " \x82\xb07\xdfJ\x04\xc9\x8a\xb4\xda\x0aN\x05\x8d\xa5" + + "\xc0ZV\x91\x0c\x1a\xa5y\xaf5\xafzO\xad4\xc9" + + "\xcb\x07\xeb\xb5[\xc7\xee\xadZo\xdbI\xad7\x12j" + + "\xbd7\x9c!\x82a\xdf~\x84h(h\x04*i\x05" + + "\xde\xa2W\xf3=\xb2N\xfa*\xf1\xfcPys\xcb\x93" + + "T:]\x8b\xe2(\xa9\x05\x8b\x9e_\x9b\x9b\x10\xe1|" + + "\xab\xae\x82\x98jA\xac\xc2\xc0\xf3\x89z\xdfi*m" + + "\x88\xd6\xb5\xc2\x03\x9dV8\x9d\x99\x12S<\x10\x0eK" + + "\xb8s\x99)\x91\xce\x93\x05\x81\xd5\x88\xe7\xb3\x1fa\xb8" + + "\xbb\xb8w\xd6\x1f\xae\x93\xaa\x0ak$\xb3\xf3 \xdd\xc2" + + "\xdb\xb5Z\x8eU\xe0\x051\x0a$P\xe8u5\xe0Y" + + "\x03\xb5n3\xa8t\xa7p\x9a\xc6Nn\xe9o\x94p" + + "\xf7\x88\x0d\xebw]\xc7\xee\xe5\x10\xd3<\x0b\x88nd" + + "=\x19\xeb\x9el(\xf0\xeajmG\xeb\xa8w\xfe\xfb" + + "w\x00\x00\x00\xff\xff9\x1a\xaea" + +func RegisterSchema(reg *schemas.Registry) { + reg.Register(&schemas.Schema{ + String: schema_85d3acc39d94e0f8, + Nodes: []uint64{ + 0x87f6d2196d414cf4, + 0x90d5073324ecc34b, + 0x983649d193295eae, + 0xa360d0951639b987, + 0xab79e1a6ecfeb87a, + 0xb374a1809b79340e, + 0xb438c10228b97446, + 0xbd820120399954be, + 0xc4dd3c458256382a, + 0xcc20b9c332c83b91, + 0xd5b0cec646441eb0, + 0xe67be4164a39ea55, + 0xeb3bcb770c8eb6be, + 0xef49df6cfa8875de, + 0xf192c7ee07114b32, + }, + Compressed: true, + }) +} diff --git a/pkg/receive/writecapnp/write_request.go b/pkg/receive/writecapnp/write_request.go new file mode 100644 index 0000000000..3b81741258 --- /dev/null +++ b/pkg/receive/writecapnp/write_request.go @@ -0,0 +1,271 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package writecapnp + +import ( + "unsafe" + + "github.com/prometheus/prometheus/model/exemplar" + "github.com/prometheus/prometheus/model/histogram" + "github.com/prometheus/prometheus/model/labels" + "github.com/thanos-io/thanos/pkg/pool" +) + +var symbolsPool = pool.MustNewBucketedPool[string](256, 65536, 2, 0) + +type HistogramSample struct { + Timestamp int64 + Histogram *histogram.Histogram + FloatHistogram *histogram.FloatHistogram +} + +type FloatSample struct { + Value float64 + Timestamp int64 +} + +type Series struct { + Labels labels.Labels + Samples []FloatSample + Histograms []HistogramSample + Exemplars []exemplar.Exemplar +} + +type Request struct { + i int + symbols *[]string + builder labels.ScratchBuilder + series TimeSeries_List +} + +func NewRequest(wr WriteRequest) (*Request, error) { + ts, err := wr.TimeSeries() + if err != nil { + return nil, err + } + symTable, err := wr.Symbols() + if err != nil { + return nil, err + } + data, err := symTable.Data() + if err != nil { + return nil, err + } + offsets, err := symTable.Offsets() + if err != nil { + return nil, err + } + + strings, _ := symbolsPool.Get(offsets.Len()) + start := uint32(0) + for i := 0; i < offsets.Len(); i++ { + end := offsets.At(i) + if start == end { + *strings = append(*strings, "") + } else { + b := data[start:end] + *strings = append(*strings, unsafe.String(&b[0], len(b))) + } + start = end + } + + return &Request{ + i: -1, + symbols: strings, + series: ts, + builder: labels.NewScratchBuilder(8), + }, nil +} + +func (s *Request) Next() bool { + s.i++ + return s.i < s.series.Len() +} + +func (s *Request) At(t *Series) error { + lbls, err := s.series.At(s.i).Labels() + if err != nil { + return err + } + + s.builder.Reset() + for i := 0; i < lbls.Len(); i++ { + lbl := lbls.At(i) + s.builder.Add((*s.symbols)[lbl.Name()], (*s.symbols)[lbl.Value()]) + } + s.builder.Overwrite(&t.Labels) + + samples, err := s.series.At(s.i).Samples() + if err != nil { + return err + } + t.Samples = t.Samples[:0] + for i := 0; i < samples.Len(); i++ { + sample := samples.At(i) + t.Samples = append(t.Samples, FloatSample{ + Value: sample.Value(), + Timestamp: sample.Timestamp(), + }) + } + + histograms, err := s.series.At(s.i).Histograms() + if err != nil { + return err + } + t.Histograms = t.Histograms[:0] + for i := 0; i < histograms.Len(); i++ { + h, err := s.readHistogram(histograms.At(i)) + if err != nil { + return err + } + t.Histograms = append(t.Histograms, h) + } + + exemplars, err := s.series.At(s.i).Exemplars() + if err != nil { + return err + } + t.Exemplars = t.Exemplars[:0] + for i := 0; i < exemplars.Len(); i++ { + ex, err := s.readExemplar(s.symbols, exemplars.At(i)) + if err != nil { + return err + } + t.Exemplars = append(t.Exemplars, ex) + } + return nil +} + +func (s *Request) readHistogram(src Histogram) (HistogramSample, error) { + var ( + h *histogram.Histogram + fh *histogram.FloatHistogram + err error + ) + if src.Count().Which() == Histogram_count_Which_countInt { + h = &histogram.Histogram{ + CounterResetHint: histogram.CounterResetHint(src.ResetHint()), + Count: src.Count().CountInt(), + Sum: src.Sum(), + Schema: src.Schema(), + ZeroThreshold: src.ZeroThreshold(), + ZeroCount: src.ZeroCount().ZeroCountInt(), + } + h.PositiveSpans, h.NegativeSpans, err = createSpans(src) + if err != nil { + return HistogramSample{}, err + } + + positiveDeltas, err := src.PositiveDeltas() + if err != nil { + return HistogramSample{}, err + } + if positiveDeltas.Len() > 0 { + h.PositiveBuckets = make([]int64, positiveDeltas.Len()) + for i := 0; i < positiveDeltas.Len(); i++ { + h.PositiveBuckets[i] = positiveDeltas.At(i) + } + } + + negativeDeltas, err := src.NegativeDeltas() + if err != nil { + return HistogramSample{}, err + } + if negativeDeltas.Len() > 0 { + h.NegativeBuckets = make([]int64, negativeDeltas.Len()) + for i := 0; i < negativeDeltas.Len(); i++ { + h.NegativeBuckets[i] = negativeDeltas.At(i) + } + } + } else { + fh = &histogram.FloatHistogram{ + CounterResetHint: histogram.CounterResetHint(src.ResetHint()), + Count: src.Count().CountFloat(), + Sum: src.Sum(), + Schema: src.Schema(), + ZeroThreshold: src.ZeroThreshold(), + ZeroCount: src.ZeroCount().ZeroCountFloat(), + } + fh.PositiveSpans, fh.NegativeSpans, err = createSpans(src) + if err != nil { + return HistogramSample{}, err + } + + positiveCounts, err := src.PositiveCounts() + if err != nil { + return HistogramSample{}, err + } + if positiveCounts.Len() > 0 { + fh.PositiveBuckets = make([]float64, positiveCounts.Len()) + for i := 0; i < positiveCounts.Len(); i++ { + fh.PositiveBuckets[i] = positiveCounts.At(i) + } + } + + negativeCounts, err := src.NegativeCounts() + if err != nil { + return HistogramSample{}, err + } + if negativeCounts.Len() > 0 { + fh.NegativeBuckets = make([]float64, negativeCounts.Len()) + for i := 0; i < negativeCounts.Len(); i++ { + fh.NegativeBuckets[i] = negativeCounts.At(i) + } + } + } + + return HistogramSample{ + Timestamp: src.Timestamp(), + Histogram: h, + FloatHistogram: fh, + }, nil +} + +type spanGetter interface { + PositiveSpans() (BucketSpan_List, error) + NegativeSpans() (BucketSpan_List, error) +} + +func createSpans(src spanGetter) ([]histogram.Span, []histogram.Span, error) { + positiveSpans, err := src.PositiveSpans() + if err != nil { + return nil, nil, err + } + negativeSpans, err := src.NegativeSpans() + if err != nil { + return nil, nil, err + } + return copySpans(positiveSpans), copySpans(negativeSpans), nil +} + +func copySpans(src BucketSpan_List) []histogram.Span { + spans := make([]histogram.Span, src.Len()) + for i := 0; i < src.Len(); i++ { + spans[i].Offset = src.At(i).Offset() + spans[i].Length = src.At(i).Length() + } + return spans +} + +func (s *Request) readExemplar(symbols *[]string, e Exemplar) (exemplar.Exemplar, error) { + ex := exemplar.Exemplar{} + lbls, err := e.Labels() + if err != nil { + return ex, err + } + + builder := labels.ScratchBuilder{} + for i := 0; i < lbls.Len(); i++ { + builder.Add((*symbols)[lbls.At(i).Name()], (*symbols)[lbls.At(i).Value()]) + } + ex.Labels = builder.Labels() + ex.Value = e.Value() + ex.Ts = e.Timestamp() + return ex, nil +} + +func (s *Request) Close() error { + symbolsPool.Put(s.symbols) + return nil +} diff --git a/pkg/receive/writecapnp/write_request_test.go b/pkg/receive/writecapnp/write_request_test.go new file mode 100644 index 0000000000..837c015aa5 --- /dev/null +++ b/pkg/receive/writecapnp/write_request_test.go @@ -0,0 +1,42 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package writecapnp + +import ( + "testing" + + "capnproto.org/go/capnp/v3" + "github.com/stretchr/testify/require" +) + +func TestNewRequest(t *testing.T) { + arena := capnp.SingleSegment(nil) + + _, seg, err := capnp.NewMessage(arena) + require.NoError(t, err) + + wr, err := NewRootWriteRequest(seg) + require.NoError(t, err) + + symbols, err := NewSymbols(seg) + require.NoError(t, err) + + require.NoError(t, symbols.SetData([]byte(`foobar`))) + list, err := capnp.NewUInt32List( + seg, 2, + ) + require.NoError(t, err) + list.Set(0, 3) + list.Set(1, 6) + + require.NoError(t, symbols.SetOffsets(list)) + require.NoError(t, wr.SetSymbols(symbols)) + + req, err := NewRequest(wr) + require.NoError(t, err) + + require.Equal(t, "foo", (*req.symbols)[0]) + require.Equal(t, "bar", (*req.symbols)[1]) + +} diff --git a/pkg/receive/writer.go b/pkg/receive/writer.go index 26fd679f54..d17fd6453c 100644 --- a/pkg/receive/writer.go +++ b/pkg/receive/writer.go @@ -72,24 +72,9 @@ func NewWriter(logger log.Logger, multiTSDB TenantStorage, opts *WriterOptions) } } -func (r *Writer) Write(ctx context.Context, tenantID string, wreq *prompb.WriteRequest) error { +func (r *Writer) Write(ctx context.Context, tenantID string, wreq []prompb.TimeSeries) error { tLogger := log.With(r.logger, "tenant", tenantID) - var ( - numLabelsOutOfOrder = 0 - numLabelsDuplicates = 0 - numLabelsEmpty = 0 - - numSamplesOutOfOrder = 0 - numSamplesDuplicates = 0 - numSamplesOutOfBounds = 0 - numSamplesTooOld = 0 - - numExemplarsOutOfOrder = 0 - numExemplarsDuplicate = 0 - numExemplarsLabelLength = 0 - ) - s, err := r.multiTSDB.TenantAppendable(tenantID) if err != nil { return errors.Wrap(err, "get tenant appendable") @@ -104,33 +89,21 @@ func (r *Writer) Write(ctx context.Context, tenantID string, wreq *prompb.WriteR } getRef := app.(storage.GetRef) var ( - ref storage.SeriesRef - errs writeErrors + ref storage.SeriesRef + errorTracker writeErrorTracker ) app = &ReceiveAppender{ tLogger: tLogger, tooFarInFuture: r.opts.TooFarInFutureTimeWindow, Appender: app, } - for _, t := range wreq.Timeseries { + + for _, t := range wreq { // Check if time series labels are valid. If not, skip the time series // and report the error. if err := labelpb.ValidateLabels(t.Labels); err != nil { lset := &labelpb.ZLabelSet{Labels: t.Labels} - switch err { - case labelpb.ErrOutOfOrderLabels: - numLabelsOutOfOrder++ - level.Debug(tLogger).Log("msg", "Out of order labels in the label set", "lset", lset.String()) - case labelpb.ErrDuplicateLabels: - numLabelsDuplicates++ - level.Debug(tLogger).Log("msg", "Duplicate labels in the label set", "lset", lset.String()) - case labelpb.ErrEmptyLabels: - numLabelsEmpty++ - level.Debug(tLogger).Log("msg", "Labels with empty name in the label set", "lset", lset.String()) - default: - level.Debug(tLogger).Log("msg", "Error validating labels", "err", err) - } - + errorTracker.addLabelsError(err, lset, tLogger) continue } @@ -148,26 +121,12 @@ func (r *Writer) Write(ctx context.Context, tenantID string, wreq *prompb.WriteR // Append as many valid samples as possible, but keep track of the errors. for _, s := range t.Samples { ref, err = app.Append(ref, lset, s.Timestamp, s.Value) - switch err { - case storage.ErrOutOfOrderSample: - numSamplesOutOfOrder++ - level.Debug(tLogger).Log("msg", "Out of order sample", "lset", lset, "value", s.Value, "timestamp", s.Timestamp) - case storage.ErrDuplicateSampleForTimestamp: - numSamplesDuplicates++ - level.Debug(tLogger).Log("msg", "Duplicate sample for timestamp", "lset", lset, "value", s.Value, "timestamp", s.Timestamp) - case storage.ErrOutOfBounds: - numSamplesOutOfBounds++ - level.Debug(tLogger).Log("msg", "Out of bounds metric", "lset", lset, "value", s.Value, "timestamp", s.Timestamp) - case storage.ErrTooOldSample: - numSamplesTooOld++ - level.Debug(tLogger).Log("msg", "Sample is too old", "lset", lset, "value", s.Value, "timestamp", s.Timestamp) - default: - if err != nil { - level.Debug(tLogger).Log("msg", "Error ingesting sample", "err", err) - } - } + errorTracker.addSampleError(err, tLogger, lset, s.Timestamp, s.Value) } + b := labels.ScratchBuilder{} + b.Labels() + for _, hp := range t.Histograms { var ( h *histogram.Histogram @@ -181,27 +140,10 @@ func (r *Writer) Write(ctx context.Context, tenantID string, wreq *prompb.WriteR } ref, err = app.AppendHistogram(ref, lset, hp.Timestamp, h, fh) - switch err { - case storage.ErrOutOfOrderSample: - numSamplesOutOfOrder++ - level.Debug(tLogger).Log("msg", "Out of order histogram", "lset", lset, "timestamp", hp.Timestamp) - case storage.ErrDuplicateSampleForTimestamp: - numSamplesDuplicates++ - level.Debug(tLogger).Log("msg", "Duplicate histogram for timestamp", "lset", lset, "timestamp", hp.Timestamp) - case storage.ErrOutOfBounds: - numSamplesOutOfBounds++ - level.Debug(tLogger).Log("msg", "Out of bounds metric", "lset", lset, "timestamp", hp.Timestamp) - case storage.ErrTooOldSample: - numSamplesTooOld++ - level.Debug(tLogger).Log("msg", "Histogram is too old", "lset", lset, "timestamp", hp.Timestamp) - default: - if err != nil { - level.Debug(tLogger).Log("msg", "Error ingesting histogram", "err", err) - } - } + errorTracker.addHistogramError(err, tLogger, lset, hp.Timestamp) } - // Current implemetation of app.AppendExemplar doesn't create a new series, so it must be already present. + // Current implementation of app.AppendExemplar doesn't create a new series, so it must be already present. // We drop the exemplars in case the series doesn't exist. if ref != 0 && len(t.Exemplars) > 0 { for _, ex := range t.Exemplars { @@ -214,67 +156,13 @@ func (r *Writer) Write(ctx context.Context, tenantID string, wreq *prompb.WriteR Ts: ex.Timestamp, HasTs: true, }); err != nil { - switch err { - case storage.ErrOutOfOrderExemplar: - numExemplarsOutOfOrder++ - level.Debug(exLogger).Log("msg", "Out of order exemplar") - case storage.ErrDuplicateExemplar: - numExemplarsDuplicate++ - level.Debug(exLogger).Log("msg", "Duplicate exemplar") - case storage.ErrExemplarLabelLength: - numExemplarsLabelLength++ - level.Debug(exLogger).Log("msg", "Label length for exemplar exceeds max limit", "limit", exemplar.ExemplarMaxLabelSetLength) - default: - level.Debug(exLogger).Log("msg", "Error ingesting exemplar", "err", err) - } + errorTracker.addExemplarError(err, exLogger) } } } } - if numLabelsOutOfOrder > 0 { - level.Info(tLogger).Log("msg", "Error on series with out-of-order labels", "numDropped", numLabelsOutOfOrder) - errs.Add(errors.Wrapf(labelpb.ErrOutOfOrderLabels, "add %d series", numLabelsOutOfOrder)) - } - if numLabelsDuplicates > 0 { - level.Info(tLogger).Log("msg", "Error on series with duplicate labels", "numDropped", numLabelsDuplicates) - errs.Add(errors.Wrapf(labelpb.ErrDuplicateLabels, "add %d series", numLabelsDuplicates)) - } - if numLabelsEmpty > 0 { - level.Info(tLogger).Log("msg", "Error on series with empty label name or value", "numDropped", numLabelsEmpty) - errs.Add(errors.Wrapf(labelpb.ErrEmptyLabels, "add %d series", numLabelsEmpty)) - } - - if numSamplesOutOfOrder > 0 { - level.Info(tLogger).Log("msg", "Error on ingesting out-of-order samples", "numDropped", numSamplesOutOfOrder) - errs.Add(errors.Wrapf(storage.ErrOutOfOrderSample, "add %d samples", numSamplesOutOfOrder)) - } - if numSamplesDuplicates > 0 { - level.Info(tLogger).Log("msg", "Error on ingesting samples with different value but same timestamp", "numDropped", numSamplesDuplicates) - errs.Add(errors.Wrapf(storage.ErrDuplicateSampleForTimestamp, "add %d samples", numSamplesDuplicates)) - } - if numSamplesOutOfBounds > 0 { - level.Info(tLogger).Log("msg", "Error on ingesting samples that are too old or are too far into the future", "numDropped", numSamplesOutOfBounds) - errs.Add(errors.Wrapf(storage.ErrOutOfBounds, "add %d samples", numSamplesOutOfBounds)) - } - if numSamplesTooOld > 0 { - level.Info(tLogger).Log("msg", "Error on ingesting samples that are outside of the allowed out-of-order time window", "numDropped", numSamplesTooOld) - errs.Add(errors.Wrapf(storage.ErrTooOldSample, "add %d samples", numSamplesTooOld)) - } - - if numExemplarsOutOfOrder > 0 { - level.Info(tLogger).Log("msg", "Error on ingesting out-of-order exemplars", "numDropped", numExemplarsOutOfOrder) - errs.Add(errors.Wrapf(storage.ErrOutOfOrderExemplar, "add %d exemplars", numExemplarsOutOfOrder)) - } - if numExemplarsDuplicate > 0 { - level.Info(tLogger).Log("msg", "Error on ingesting duplicate exemplars", "numDropped", numExemplarsDuplicate) - errs.Add(errors.Wrapf(storage.ErrDuplicateExemplar, "add %d exemplars", numExemplarsDuplicate)) - } - if numExemplarsLabelLength > 0 { - level.Info(tLogger).Log("msg", "Error on ingesting exemplars with label length exceeding maximum limit", "numDropped", numExemplarsLabelLength) - errs.Add(errors.Wrapf(storage.ErrExemplarLabelLength, "add %d exemplars", numExemplarsLabelLength)) - } - + errs := errorTracker.collectErrors(tLogger) if err := app.Commit(); err != nil { errs.Add(errors.Wrap(err, "commit samples")) } diff --git a/pkg/receive/writer_errors.go b/pkg/receive/writer_errors.go new file mode 100644 index 0000000000..ee807564e6 --- /dev/null +++ b/pkg/receive/writer_errors.go @@ -0,0 +1,161 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package receive + +import ( + "github.com/go-kit/log" + "github.com/go-kit/log/level" + "github.com/pkg/errors" + "github.com/prometheus/prometheus/model/exemplar" + "github.com/prometheus/prometheus/model/labels" + "github.com/prometheus/prometheus/storage" + "github.com/thanos-io/thanos/pkg/store/labelpb" +) + +type writeErrorTracker struct { + numLabelsOutOfOrder int + numLabelsDuplicates int + numLabelsEmpty int + + numSamplesOutOfOrder int + numSamplesDuplicates int + numSamplesOutOfBounds int + numSamplesTooOld int + + numExemplarsOutOfOrder int + numExemplarsDuplicate int + numExemplarsLabelLength int +} + +func (a *writeErrorTracker) addLabelsError(err error, lset *labelpb.ZLabelSet, logger log.Logger) { + if err == nil { + return + } + + switch err { + case labelpb.ErrOutOfOrderLabels: + a.numLabelsOutOfOrder++ + level.Debug(logger).Log("msg", "Out of order labels in the label set", "lset", lset.String()) + case labelpb.ErrDuplicateLabels: + a.numLabelsDuplicates++ + level.Debug(logger).Log("msg", "Duplicate labels in the label set", "lset", lset.String()) + case labelpb.ErrEmptyLabels: + a.numLabelsEmpty++ + level.Debug(logger).Log("msg", "Labels with empty name in the label set", "lset", lset.String()) + default: + level.Debug(logger).Log("msg", "Error validating labels", "err", err) + } +} + +func (a *writeErrorTracker) addSampleError(err error, tLogger log.Logger, lset labels.Labels, t int64, v float64) { + if err == nil { + return + } + + switch { + case errors.Is(err, storage.ErrOutOfOrderSample): + a.numSamplesOutOfOrder++ + level.Debug(tLogger).Log("msg", "Out of order sample", "lset", lset, "value", v, "timestamp", t) + case errors.Is(err, storage.ErrDuplicateSampleForTimestamp): + a.numSamplesDuplicates++ + level.Debug(tLogger).Log("msg", "Duplicate sample for timestamp", "lset", lset, "value", v, "timestamp", t) + case errors.Is(err, storage.ErrOutOfBounds): + a.numSamplesOutOfBounds++ + level.Debug(tLogger).Log("msg", "Out of bounds metric", "lset", lset, "value", v, "timestamp", t) + case errors.Is(err, storage.ErrTooOldSample): + a.numSamplesTooOld++ + level.Debug(tLogger).Log("msg", "Sample is too old", "lset", lset, "value", v, "timestamp", t) + default: + level.Debug(tLogger).Log("msg", "Error ingesting sample", "err", err) + } +} + +func (a *writeErrorTracker) addHistogramError(err error, tLogger log.Logger, lset labels.Labels, timestamp int64) { + if err == nil { + return + } + switch { + case errors.Is(err, storage.ErrOutOfOrderSample): + a.numSamplesOutOfOrder++ + level.Debug(tLogger).Log("msg", "Out of order histogram", "lset", lset, "timestamp", timestamp) + case errors.Is(err, storage.ErrDuplicateSampleForTimestamp): + a.numSamplesDuplicates++ + level.Debug(tLogger).Log("msg", "Duplicate histogram for timestamp", "lset", lset, "timestamp", timestamp) + case errors.Is(err, storage.ErrOutOfBounds): + a.numSamplesOutOfBounds++ + level.Debug(tLogger).Log("msg", "Out of bounds metric", "lset", lset, "timestamp", timestamp) + case errors.Is(err, storage.ErrTooOldSample): + a.numSamplesTooOld++ + level.Debug(tLogger).Log("msg", "Histogram is too old", "lset", lset, "timestamp", timestamp) + default: + level.Debug(tLogger).Log("msg", "Error ingesting histogram", "err", err) + } +} + +func (a *writeErrorTracker) addExemplarError(err error, exLogger log.Logger) { + if err == nil { + return + } + + switch { + case errors.Is(err, storage.ErrOutOfOrderExemplar): + a.numExemplarsOutOfOrder++ + level.Debug(exLogger).Log("msg", "Out of order exemplar") + case errors.Is(err, storage.ErrDuplicateExemplar): + a.numExemplarsDuplicate++ + level.Debug(exLogger).Log("msg", "Duplicate exemplar") + case errors.Is(err, storage.ErrExemplarLabelLength): + a.numExemplarsLabelLength++ + level.Debug(exLogger).Log("msg", "Label length for exemplar exceeds max limit", "limit", exemplar.ExemplarMaxLabelSetLength) + default: + level.Debug(exLogger).Log("msg", "Error ingesting exemplar", "err", err) + } +} + +func (a *writeErrorTracker) collectErrors(tLogger log.Logger) writeErrors { + var errs writeErrors + if a.numLabelsOutOfOrder > 0 { + level.Warn(tLogger).Log("msg", "Error on series with out-of-order labels", "numDropped", a.numLabelsOutOfOrder) + errs.Add(errors.Wrapf(labelpb.ErrOutOfOrderLabels, "add %d series", a.numLabelsOutOfOrder)) + } + if a.numLabelsDuplicates > 0 { + level.Warn(tLogger).Log("msg", "Error on series with duplicate labels", "numDropped", a.numLabelsDuplicates) + errs.Add(errors.Wrapf(labelpb.ErrDuplicateLabels, "add %d series", a.numLabelsDuplicates)) + } + if a.numLabelsEmpty > 0 { + level.Warn(tLogger).Log("msg", "Error on series with empty label name or value", "numDropped", a.numLabelsEmpty) + errs.Add(errors.Wrapf(labelpb.ErrEmptyLabels, "add %d series", a.numLabelsEmpty)) + } + + if a.numSamplesOutOfOrder > 0 { + level.Warn(tLogger).Log("msg", "Error on ingesting out-of-order samples", "numDropped", a.numSamplesOutOfOrder) + errs.Add(errors.Wrapf(storage.ErrOutOfOrderSample, "add %d samples", a.numSamplesOutOfOrder)) + } + if a.numSamplesDuplicates > 0 { + level.Warn(tLogger).Log("msg", "Error on ingesting samples with different value but same timestamp", "numDropped", a.numSamplesDuplicates) + errs.Add(errors.Wrapf(storage.ErrDuplicateSampleForTimestamp, "add %d samples", a.numSamplesDuplicates)) + } + if a.numSamplesOutOfBounds > 0 { + level.Warn(tLogger).Log("msg", "Error on ingesting samples that are too old or are too far into the future", "numDropped", a.numSamplesOutOfBounds) + errs.Add(errors.Wrapf(storage.ErrOutOfBounds, "add %d samples", a.numSamplesOutOfBounds)) + } + if a.numSamplesTooOld > 0 { + level.Warn(tLogger).Log("msg", "Error on ingesting samples that are outside of the allowed out-of-order time window", "numDropped", a.numSamplesTooOld) + errs.Add(errors.Wrapf(storage.ErrTooOldSample, "add %d samples", a.numSamplesTooOld)) + } + + if a.numExemplarsOutOfOrder > 0 { + level.Warn(tLogger).Log("msg", "Error on ingesting out-of-order exemplars", "numDropped", a.numExemplarsOutOfOrder) + errs.Add(errors.Wrapf(storage.ErrOutOfOrderExemplar, "add %d exemplars", a.numExemplarsOutOfOrder)) + } + if a.numExemplarsDuplicate > 0 { + level.Warn(tLogger).Log("msg", "Error on ingesting duplicate exemplars", "numDropped", a.numExemplarsDuplicate) + errs.Add(errors.Wrapf(storage.ErrDuplicateExemplar, "add %d exemplars", a.numExemplarsDuplicate)) + } + if a.numExemplarsLabelLength > 0 { + level.Warn(tLogger).Log("msg", "Error on ingesting exemplars with label length exceeding maximum limit", "numDropped", a.numExemplarsLabelLength) + errs.Add(errors.Wrapf(storage.ErrExemplarLabelLength, "add %d exemplars", a.numExemplarsLabelLength)) + } + return errs +} diff --git a/pkg/receive/writer_test.go b/pkg/receive/writer_test.go index 34613794b8..2db5e6a341 100644 --- a/pkg/receive/writer_test.go +++ b/pkg/receive/writer_test.go @@ -10,6 +10,8 @@ import ( "testing" "time" + "github.com/thanos-io/thanos/pkg/receive/writecapnp" + "github.com/efficientgo/core/testutil" "github.com/go-kit/log" "github.com/pkg/errors" @@ -29,6 +31,8 @@ import ( ) func TestWriter(t *testing.T) { + t.Parallel() + now := model.Now() lbls := []labelpb.ZLabel{{Name: "__name__", Value: "test"}} tests := map[string]struct { @@ -327,69 +331,110 @@ func TestWriter(t *testing.T) { for testName, testData := range tests { t.Run(testName, func(t *testing.T) { - dir := t.TempDir() - logger := log.NewNopLogger() - - m := NewMultiTSDB(dir, logger, prometheus.NewRegistry(), &tsdb.Options{ - MinBlockDuration: (2 * time.Hour).Milliseconds(), - MaxBlockDuration: (2 * time.Hour).Milliseconds(), - RetentionDuration: (6 * time.Hour).Milliseconds(), - NoLockfile: true, - MaxExemplars: testData.maxExemplars, - EnableExemplarStorage: true, - EnableNativeHistograms: true, - }, - labels.FromStrings("replica", "01"), - "tenant_id", - nil, - false, - metadata.NoneFunc, - ) - t.Cleanup(func() { testutil.Ok(t, m.Close()) }) - - testutil.Ok(t, m.Flush()) - testutil.Ok(t, m.Open()) - - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() + t.Run("proto_writer", func(t *testing.T) { + logger, m, app := setupMultitsdb(t, testData.maxExemplars) + + w := NewWriter(logger, m, testData.opts) + + for idx, req := range testData.reqs { + err := w.Write(context.Background(), tenancy.DefaultTenant, req.Timeseries) + + // We expect no error on any request except the last one + // which may error (and in that case we assert on it). + if testData.expectedErr == nil || idx < len(testData.reqs)-1 { + testutil.Ok(t, err) + } else { + testutil.NotOk(t, err) + testutil.Equals(t, testData.expectedErr.Error(), err.Error()) + } + } - app, err := m.TenantAppendable(tenancy.DefaultTenant) - testutil.Ok(t, err) + assertWrittenData(t, app, testData.expectedIngested) + }) - testutil.Ok(t, runutil.Retry(1*time.Second, ctx.Done(), func() error { - _, err = app.Appender(context.Background()) - return err - })) + t.Run("capnproto_writer", func(t *testing.T) { + logger, m, app := setupMultitsdb(t, testData.maxExemplars) - w := NewWriter(logger, m, testData.opts) + opts := &CapNProtoWriterOptions{} + if testData.opts != nil { + opts.TooFarInFutureTimeWindow = testData.opts.TooFarInFutureTimeWindow + } + w := NewCapNProtoWriter(logger, m, opts) - for idx, req := range testData.reqs { - err = w.Write(context.Background(), tenancy.DefaultTenant, req) + for idx, req := range testData.reqs { + capnpReq, err := writecapnp.Build(tenancy.DefaultTenant, req.Timeseries) + testutil.Ok(t, err) - // We expect no error on any request except the last one - // which may error (and in that case we assert on it). - if testData.expectedErr == nil || idx < len(testData.reqs)-1 { + wr, err := writecapnp.NewRequest(capnpReq) testutil.Ok(t, err) - } else { - testutil.NotOk(t, err) - testutil.Equals(t, testData.expectedErr.Error(), err.Error()) + err = w.Write(context.Background(), tenancy.DefaultTenant, wr) + + // We expect no error on any request except the last one + // which may error (and in that case we assert on it). + if testData.expectedErr == nil || idx < len(testData.reqs)-1 { + testutil.Ok(t, err) + } else { + testutil.NotOk(t, err) + testutil.Equals(t, testData.expectedErr.Error(), err.Error()) + } } - } - - // On each expected series, assert we have a ref available. - a, err := app.Appender(context.Background()) - testutil.Ok(t, err) - gr := a.(storage.GetRef) - - for _, ts := range testData.expectedIngested { - l := labelpb.ZLabelsToPromLabels(ts.Labels) - ref, _ := gr.GetRef(l, l.Hash()) - testutil.Assert(t, ref != 0, fmt.Sprintf("appender should have reference to series %v", ts)) - } + + assertWrittenData(t, app, testData.expectedIngested) + }) }) } } +func assertWrittenData(t *testing.T, app Appendable, expectedIngested []prompb.TimeSeries) { + // On each expected series, assert we have a ref available. + a, err := app.Appender(context.Background()) + testutil.Ok(t, err) + gr := a.(storage.GetRef) + + for _, ts := range expectedIngested { + l := labelpb.ZLabelsToPromLabels(ts.Labels) + ref, _ := gr.GetRef(l, l.Hash()) + testutil.Assert(t, ref != 0, fmt.Sprintf("appender should have reference to series %v", ts)) + } +} + +func setupMultitsdb(t *testing.T, maxExemplars int64) (log.Logger, *MultiTSDB, Appendable) { + dir := t.TempDir() + logger := log.NewNopLogger() + + m := NewMultiTSDB(dir, logger, prometheus.NewRegistry(), &tsdb.Options{ + MinBlockDuration: (2 * time.Hour).Milliseconds(), + MaxBlockDuration: (2 * time.Hour).Milliseconds(), + RetentionDuration: (6 * time.Hour).Milliseconds(), + NoLockfile: true, + MaxExemplars: maxExemplars, + EnableExemplarStorage: true, + EnableNativeHistograms: true, + }, + labels.FromStrings("replica", "01"), + "tenant_id", + nil, + false, + metadata.NoneFunc, + ) + t.Cleanup(func() { testutil.Ok(t, m.Close()) }) + + testutil.Ok(t, m.Flush()) + testutil.Ok(t, m.Open()) + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + app, err := m.TenantAppendable(tenancy.DefaultTenant) + testutil.Ok(t, err) + + testutil.Ok(t, runutil.Retry(1*time.Second, ctx.Done(), func() error { + _, err = app.Appender(context.Background()) + return err + })) + return logger, m, app +} + func BenchmarkWriterTimeSeriesWithSingleLabel_10(b *testing.B) { benchmarkWriter(b, 1, 10, false) } func BenchmarkWriterTimeSeriesWithSingleLabel_100(b *testing.B) { benchmarkWriter(b, 1, 100, false) } func BenchmarkWriterTimeSeriesWithSingleLabel_1000(b *testing.B) { benchmarkWriter(b, 1, 1000, false) } @@ -466,7 +511,7 @@ func benchmarkWriter(b *testing.B, labelsNum int, seriesNum int, generateHistogr b.ResetTimer() for i := 0; i < b.N; i++ { - testutil.Ok(b, w.Write(ctx, "foo", wreq)) + testutil.Ok(b, w.Write(ctx, "foo", wreq.Timeseries)) } }) @@ -477,7 +522,7 @@ func benchmarkWriter(b *testing.B, labelsNum int, seriesNum int, generateHistogr b.ResetTimer() for i := 0; i < b.N; i++ { - testutil.Ok(b, w.Write(ctx, "foo", wreq)) + testutil.Ok(b, w.Write(ctx, "foo", wreq.Timeseries)) } }) diff --git a/pkg/reloader/reloader.go b/pkg/reloader/reloader.go index 0821b90fed..e2e3887ac1 100644 --- a/pkg/reloader/reloader.go +++ b/pkg/reloader/reloader.go @@ -75,7 +75,7 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/minio/sha256-simd" - ps "github.com/mitchellh/go-ps" + "github.com/mitchellh/go-ps" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" @@ -87,14 +87,17 @@ import ( // It optionally substitutes environment variables in the configuration. // Referenced environment variables must be of the form `$(var)` (not `$var` or `${var}`). type Reloader struct { - logger log.Logger - cfgFile string - cfgOutputFile string - cfgDirs []CfgDirOption - watchInterval time.Duration - retryInterval time.Duration - watchedDirs []string - watcher *watcher + logger log.Logger + cfgFile string + cfgOutputFile string + cfgDirs []CfgDirOption + tolerateEnvVarExpansionErrors bool + retryInterval time.Duration + watchInterval time.Duration + watchedDirs []string + watcher *watcher + + tr TriggerReloader tr TriggerReloader @@ -104,13 +107,14 @@ type Reloader struct { lastCfgDirFiles []map[string]struct{} forceReload bool - reloads prometheus.Counter - reloadErrors prometheus.Counter - lastReloadSuccess prometheus.Gauge - lastReloadSuccessTimestamp prometheus.Gauge - configApplyErrors prometheus.Counter - configApply prometheus.Counter - reloaderInfo *prometheus.GaugeVec + reloads prometheus.Counter + reloadErrors prometheus.Counter + lastReloadSuccess prometheus.Gauge + lastReloadSuccessTimestamp prometheus.Gauge + configApplyErrors prometheus.Counter + configEnvVarExpansionErrors prometheus.Gauge + configApply prometheus.Counter + reloaderInfo *prometheus.GaugeVec } // TriggerReloader reloads the configuration of the process. @@ -172,6 +176,9 @@ type Options struct { // RetryInterval controls how often the reloader retries a reloading of the // configuration in case the reload operation returned an error. RetryInterval time.Duration + // TolerateEnvVarExpansionErrors suppresses errors when expanding environment variables in the config file, and + // leaves the unset variables as is. All found environment variables are still expanded. + TolerateEnvVarExpansionErrors bool } var firstGzipBytes = []byte{0x1f, 0x8b, 0x08} @@ -183,15 +190,16 @@ func New(logger log.Logger, reg prometheus.Registerer, o *Options) *Reloader { logger = log.NewNopLogger() } r := &Reloader{ - logger: logger, - cfgFile: o.CfgFile, - cfgOutputFile: o.CfgOutputFile, - cfgDirs: o.CfgDirs, - lastCfgDirFiles: make([]map[string]struct{}, len(o.CfgDirs)), - watcher: newWatcher(logger, reg, o.DelayInterval), - watchedDirs: o.WatchedDirs, - watchInterval: o.WatchInterval, - retryInterval: o.RetryInterval, + logger: logger, + cfgFile: o.CfgFile, + cfgOutputFile: o.CfgOutputFile, + cfgDirs: o.CfgDirs, + lastCfgDirFiles: make([]map[string]struct{}, len(o.CfgDirs)), + watcher: newWatcher(logger, reg, o.DelayInterval), + watchedDirs: o.WatchedDirs, + watchInterval: o.WatchInterval, + retryInterval: o.RetryInterval, + tolerateEnvVarExpansionErrors: o.TolerateEnvVarExpansionErrors, reloads: promauto.With(reg).NewCounter( prometheus.CounterOpts{ @@ -229,6 +237,12 @@ func New(logger log.Logger, reg prometheus.Registerer, o *Options) *Reloader { Help: "Total number of config apply operations that failed.", }, ), + configEnvVarExpansionErrors: promauto.With(reg).NewGauge( + prometheus.GaugeOpts{ + Name: "reloader_config_environment_variable_expansion_errors", + Help: "Number of environment variable expansions that failed during the last operation.", + }, + ), reloaderInfo: promauto.With(reg).NewGaugeVec( prometheus.GaugeOpts{ Name: "reloader_info", @@ -348,7 +362,7 @@ func (r *Reloader) Watch(ctx context.Context) error { } } -func normalize(logger log.Logger, inputFile, outputFile string) error { +func (r *Reloader) normalize(inputFile, outputFile string) error { b, err := os.ReadFile(inputFile) if err != nil { return errors.Wrap(err, "read file") @@ -360,7 +374,7 @@ func normalize(logger log.Logger, inputFile, outputFile string) error { if err != nil { return errors.Wrap(err, "create gzip reader") } - defer runutil.CloseWithLogOnErr(logger, zr, "gzip reader close") + defer runutil.CloseWithLogOnErr(r.logger, zr, "gzip reader close") b, err = io.ReadAll(zr) if err != nil { @@ -368,7 +382,7 @@ func normalize(logger log.Logger, inputFile, outputFile string) error { } } - b, err = expandEnv(b) + b, err = r.expandEnv(b) if err != nil { return errors.Wrap(err, "expand environment variables") } @@ -402,7 +416,7 @@ func (r *Reloader) apply(ctx context.Context) error { } cfgHash = h.Sum(nil) if r.cfgOutputFile != "" { - if err := normalize(r.logger, r.cfgFile, r.cfgOutputFile); err != nil { + if err := r.normalize(r.cfgFile, r.cfgOutputFile); err != nil { return err } } @@ -446,7 +460,7 @@ func (r *Reloader) apply(ctx context.Context) error { outFile := filepath.Join(outDir, targetFile.Name()) cfgDirFiles[outFile] = struct{}{} - if err := normalize(r.logger, path, outFile); err != nil { + if err := r.normalize(path, outFile); err != nil { return errors.Wrapf(err, "move file: %s", path) } } @@ -692,21 +706,30 @@ func RuntimeInfoURLFromBase(u *url.URL) *url.URL { var envRe = regexp.MustCompile(`\$\(([a-zA-Z_0-9]+)\)`) -func expandEnv(b []byte) (r []byte, err error) { - r = envRe.ReplaceAllFunc(b, func(n []byte) []byte { +func (r *Reloader) expandEnv(b []byte) (replaced []byte, err error) { + configEnvVarExpansionErrorsCount := 0 + replaced = envRe.ReplaceAllFunc(b, func(n []byte) []byte { if err != nil { return nil } + m := n n = n[2 : len(n)-1] v, ok := os.LookupEnv(string(n)) if !ok { - err = errors.Errorf("found reference to unset environment variable %q", n) + configEnvVarExpansionErrorsCount++ + errStr := errors.Errorf("found reference to unset environment variable %q", n) + if r.tolerateEnvVarExpansionErrors { + level.Warn(r.logger).Log("msg", "expand environment variable", "err", errStr) + return m + } + err = errStr return nil } return []byte(v) }) - return r, err + r.configEnvVarExpansionErrors.Set(float64(configEnvVarExpansionErrorsCount)) + return replaced, err } type watcher struct { diff --git a/pkg/reloader/reloader_test.go b/pkg/reloader/reloader_test.go index c2448b6ea1..74629d7122 100644 --- a/pkg/reloader/reloader_test.go +++ b/pkg/reloader/reloader_test.go @@ -33,6 +33,8 @@ func TestMain(m *testing.M) { } func TestReloader_ConfigApply(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute) defer cancel() @@ -97,10 +99,42 @@ config: testutil.NotOk(t, err) testutil.Assert(t, strings.HasSuffix(err.Error(), `found reference to unset environment variable "TEST_RELOADER_THANOS_ENV"`), "expect error since there envvars are not set.") + // Don't fail with unset variables. + ctx2, cancel2 := context.WithTimeout(ctx, 10*time.Second) + + // Enable suppressing environment variables expansion errors. + reloader.tolerateEnvVarExpansionErrors = true + + // Set an environment variable while leaving the other unset, so as to ensure we don't break the flow when an unset + // variable is found. + testutil.Ok(t, os.Setenv("TEST_RELOADER_THANOS_ENV2", "3")) + err = reloader.Watch(ctx2) + cancel2() + + // Restore state. + reloader.tolerateEnvVarExpansionErrors = false + testutil.Ok(t, os.Unsetenv("TEST_RELOADER_THANOS_ENV2")) + + // The environment variable expansion errors should be suppressed, but recorded. + testutil.Equals(t, 1.0, promtest.ToFloat64(reloader.configEnvVarExpansionErrors)) + + // All environment variables expansion errors should be suppressed. + testutil.Ok(t, err) + + // Config should consist on unset as well as set variables. + f, err := os.ReadFile(output) + testutil.Ok(t, err) + testutil.Equals(t, ` +config: + a: 1 + b: $(TEST_RELOADER_THANOS_ENV) + c: 3 +`, string(f)) + testutil.Ok(t, os.Setenv("TEST_RELOADER_THANOS_ENV", "2")) testutil.Ok(t, os.Setenv("TEST_RELOADER_THANOS_ENV2", "3")) - rctx, cancel2 := context.WithCancel(ctx) + rctx, cancel3 := context.WithCancel(ctx) g := sync.WaitGroup{} g.Add(1) go func() { @@ -159,7 +193,7 @@ config: } } } - cancel2() + cancel3() g.Wait() testutil.Ok(t, os.Unsetenv("TEST_RELOADER_THANOS_ENV")) @@ -167,6 +201,8 @@ config: } func TestReloader_ConfigRollback(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute) defer cancel() @@ -279,6 +315,8 @@ faulty_config: } func TestReloader_ConfigDirApply(t *testing.T) { + t.Parallel() + l, err := net.Listen("tcp", "localhost:0") testutil.Ok(t, err) @@ -580,6 +618,8 @@ func TestReloader_ConfigDirApply(t *testing.T) { } func TestReloader_ConfigDirApplyBasedOnWatchInterval(t *testing.T) { + t.Parallel() + l, err := net.Listen("tcp", "localhost:0") testutil.Ok(t, err) @@ -789,6 +829,8 @@ func TestReloader_ConfigDirApplyBasedOnWatchInterval(t *testing.T) { } func TestReloader_DirectoriesApply(t *testing.T) { + t.Parallel() + l, err := net.Listen("tcp", "localhost:0") testutil.Ok(t, err) @@ -999,6 +1041,8 @@ func TestReloader_DirectoriesApply(t *testing.T) { } func TestReloader_DirectoriesApplyBasedOnWatchInterval(t *testing.T) { + t.Parallel() + l, err := net.Listen("tcp", "localhost:0") testutil.Ok(t, err) @@ -1134,6 +1178,8 @@ func TestReloader_DirectoriesApplyBasedOnWatchInterval(t *testing.T) { } func TestReloader_ConfigApplyWithWatchIntervalEqualsZero(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute) defer cancel() diff --git a/pkg/replicate/replicator.go b/pkg/replicate/replicator.go index 668d64afce..dc9e804f56 100644 --- a/pkg/replicate/replicator.go +++ b/pkg/replicate/replicator.go @@ -115,7 +115,7 @@ func RunReplicate( return errors.New("No supported bucket was configured to replicate from") } - bkt, err := client.NewBucket(logger, fromConfContentYaml, component.Replicate.String()) + bkt, err := client.NewBucket(logger, fromConfContentYaml, component.Replicate.String(), nil) if err != nil { return err } @@ -136,7 +136,7 @@ func RunReplicate( return errors.New("No supported bucket was configured to replicate to") } - toBkt, err := client.NewBucket(logger, toConfContentYaml, component.Replicate.String()) + toBkt, err := client.NewBucket(logger, toConfContentYaml, component.Replicate.String(), nil) if err != nil { return err } diff --git a/pkg/rules/manager.go b/pkg/rules/manager.go index 870b782732..9a802ce10a 100644 --- a/pkg/rules/manager.go +++ b/pkg/rules/manager.go @@ -282,7 +282,7 @@ func (g configRuleAdapter) validate() (errs []error) { return errs } -// ValidateAndCount validates all rules in the rule groups and return overal number of rules in all groups. +// ValidateAndCount validates all rules in the rule groups and return overall number of rules in all groups. // TODO(bwplotka): Replace this with upstream implementation after https://github.com/prometheus/prometheus/issues/7128 is fixed. func ValidateAndCount(group io.Reader) (numRules int, errs errutil.MultiError) { var rgs configGroups diff --git a/pkg/rules/manager_test.go b/pkg/rules/manager_test.go index 2bee9a698e..114edd5b2f 100644 --- a/pkg/rules/manager_test.go +++ b/pkg/rules/manager_test.go @@ -359,7 +359,7 @@ func TestManager_Rules(t *testing.T) { thanosRuleMgr.Run() thanosRuleMgr.Stop() }() - testRulesAgainstExamples(t, filepath.Join(curr, "../../examples/alerts"), thanosRuleMgr) + testRulesAgainstExamples(t, filepath.Join(curr, "../../examples/alerts"), thanosRuleMgr, false) } func TestManagerUpdateWithNoRules(t *testing.T) { diff --git a/pkg/rules/prometheus_test.go b/pkg/rules/prometheus_test.go index ac4ace7961..8493e63335 100644 --- a/pkg/rules/prometheus_test.go +++ b/pkg/rules/prometheus_test.go @@ -45,5 +45,5 @@ rule_files: promRules := NewPrometheus(u, promclient.NewDefaultClient(), func() labels.Labels { return labels.FromStrings("replica", "test1") }) - testRulesAgainstExamples(t, filepath.Join(root, "examples/alerts"), promRules) + testRulesAgainstExamples(t, filepath.Join(root, "examples/alerts"), promRules, true) } diff --git a/pkg/rules/proxy_test.go b/pkg/rules/proxy_test.go index 971c925e46..7873d6c763 100644 --- a/pkg/rules/proxy_test.go +++ b/pkg/rules/proxy_test.go @@ -113,27 +113,27 @@ func TestProxy(t *testing.T) { wantResponse: rulespb.NewWarningRulesResponse(errors.New("warning from client")), }, { - name: "warn: retreiving rules client failed", + name: "warn: retrieving rules client failed", request: &rulespb.RulesRequest{ Type: rulespb.RulesRequest_ALL, PartialResponseStrategy: storepb.PartialResponseStrategy_WARN, }, client: &testRulesClient{ response: nil, - rulesErr: errors.New("retreiving rules failed"), + rulesErr: errors.New("retrieving rules failed"), }, server: &testRulesServer{}, - wantResponse: rulespb.NewWarningRulesResponse(errors.New("fetching rules from rules client test: retreiving rules failed")), + wantResponse: rulespb.NewWarningRulesResponse(errors.New("fetching rules from rules client test: retrieving rules failed")), }, { - name: "warn: retreiving rules client failed, forward warning failed", + name: "warn: retrieving rules client failed, forward warning failed", request: &rulespb.RulesRequest{ Type: rulespb.RulesRequest_ALL, PartialResponseStrategy: storepb.PartialResponseStrategy_WARN, }, client: &testRulesClient{ response: nil, - rulesErr: errors.New("retreiving rules failed"), + rulesErr: errors.New("retrieving rules failed"), }, server: &testRulesServer{ sendErr: errors.New("forwarding warning response failed"), @@ -141,17 +141,17 @@ func TestProxy(t *testing.T) { wantError: errors.New("forwarding warning response failed"), }, { - name: "abort: retreiving rules client failed", + name: "abort: retrieving rules client failed", request: &rulespb.RulesRequest{ Type: rulespb.RulesRequest_ALL, PartialResponseStrategy: storepb.PartialResponseStrategy_ABORT, }, client: &testRulesClient{ response: nil, - rulesErr: errors.New("retreiving rules failed"), + rulesErr: errors.New("retrieving rules failed"), }, server: &testRulesServer{}, - wantError: errors.New("fetching rules from rules client test: retreiving rules failed"), + wantError: errors.New("fetching rules from rules client test: retrieving rules failed"), }, { name: "warn: receive failed", diff --git a/pkg/rules/queryable.go b/pkg/rules/queryable.go index 3d2335fd5a..7ceebdd890 100644 --- a/pkg/rules/queryable.go +++ b/pkg/rules/queryable.go @@ -118,12 +118,12 @@ func (q *promClientsQuerier) Select(ctx context.Context, _ bool, _ *storage.Sele } // LabelValues implements storage.LabelQuerier interface. -func (q *promClientsQuerier) LabelValues(ctx context.Context, name string, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) { +func (q *promClientsQuerier) LabelValues(ctx context.Context, name string, _ *storage.LabelHints, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) { return nil, nil, nil } // LabelNames implements storage.LabelQuerier interface. -func (q *promClientsQuerier) LabelNames(ctx context.Context, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) { +func (q *promClientsQuerier) LabelNames(ctx context.Context, _ *storage.LabelHints, matchers ...*labels.Matcher) ([]string, annotations.Annotations, error) { return nil, nil, nil } diff --git a/pkg/rules/rules.go b/pkg/rules/rules.go index 72f5db3a44..f0ca699707 100644 --- a/pkg/rules/rules.go +++ b/pkg/rules/rules.go @@ -12,9 +12,9 @@ import ( "github.com/pkg/errors" "github.com/prometheus/prometheus/model/labels" - "github.com/prometheus/prometheus/promql/parser" "github.com/prometheus/prometheus/util/annotations" + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/rules/rulespb" "github.com/thanos-io/thanos/pkg/tracing" ) @@ -64,13 +64,15 @@ func (rr *GRPCClient) Rules(ctx context.Context, req *rulespb.RulesRequest) (*ru var err error matcherSets := make([][]*labels.Matcher, len(req.MatcherString)) for i, s := range req.MatcherString { - matcherSets[i], err = parser.ParseMetricSelector(s) + matcherSets[i], err = extpromql.ParseMetricSelector(s) if err != nil { return nil, nil, errors.Wrap(err, "parser ParseMetricSelector") } } - resp.groups = filterRules(resp.groups, matcherSets) + resp.groups = filterRulesByMatchers(resp.groups, matcherSets) + resp.groups = filterRulesByNamesAndFile(resp.groups, req.RuleName, req.RuleGroup, req.File) + // TODO(bwplotka): Move to SortInterface with equal method and heap. resp.groups = dedupGroups(resp.groups) for _, g := range resp.groups { @@ -80,8 +82,57 @@ func (rr *GRPCClient) Rules(ctx context.Context, req *rulespb.RulesRequest) (*ru return &rulespb.RuleGroups{Groups: resp.groups}, resp.warnings, nil } -// filterRules filters rules in a group according to given matcherSets. -func filterRules(ruleGroups []*rulespb.RuleGroup, matcherSets [][]*labels.Matcher) []*rulespb.RuleGroup { +// filters rules by group name, rule name or file. +func filterRulesByNamesAndFile(ruleGroups []*rulespb.RuleGroup, ruleName []string, ruleGroup []string, file []string) []*rulespb.RuleGroup { + if len(ruleName) == 0 && len(ruleGroup) == 0 && len(file) == 0 { + return ruleGroups + } + + queryFormToSet := func(values []string) map[string]struct{} { + set := make(map[string]struct{}, len(values)) + for _, v := range values { + set[v] = struct{}{} + } + return set + } + + rnSet := queryFormToSet(ruleName) + rgSet := queryFormToSet(ruleGroup) + fSet := queryFormToSet(file) + + rgs := make([]*rulespb.RuleGroup, 0, len(ruleGroups)) + for _, grp := range ruleGroups { + if len(rgSet) > 0 { + if _, ok := rgSet[grp.Name]; !ok { + continue + } + } + + if len(fSet) > 0 { + if _, ok := fSet[grp.File]; !ok { + continue + } + } + + if len(rnSet) > 0 { + ruleCount := 0 + for _, r := range grp.Rules { + if _, ok := rnSet[r.GetName()]; ok { + grp.Rules[ruleCount] = r + ruleCount++ + } + } + grp.Rules = grp.Rules[:ruleCount] + } + if len(grp.Rules) > 0 { + rgs = append(rgs, grp) + } + } + return rgs +} + +// filterRulesbyMatchers filters rules in a group according to given matcherSets. +func filterRulesByMatchers(ruleGroups []*rulespb.RuleGroup, matcherSets [][]*labels.Matcher) []*rulespb.RuleGroup { if len(matcherSets) == 0 { return ruleGroups } diff --git a/pkg/rules/rules_test.go b/pkg/rules/rules_test.go index 921d4b7cc5..c4b3a5c760 100644 --- a/pkg/rules/rules_test.go +++ b/pkg/rules/rules_test.go @@ -10,6 +10,8 @@ import ( "testing" "time" + "golang.org/x/exp/slices" + "github.com/efficientgo/core/testutil" "github.com/gogo/protobuf/proto" "github.com/prometheus/prometheus/model/labels" @@ -25,7 +27,7 @@ func TestMain(m *testing.M) { } // testRulesAgainstExamples tests against alerts.yaml and rules.yaml examples. -func testRulesAgainstExamples(t *testing.T, dir string, server rulespb.RulesServer) { +func testRulesAgainstExamples(t *testing.T, dir string, server rulespb.RulesServer, removeEmptyGroups bool) { t.Helper() // We don't test internals, just if groups are expected. @@ -158,7 +160,9 @@ func testRulesAgainstExamples(t *testing.T, dir string, server rulespb.RulesServ } testutil.Ok(t, err) - expectedForType := expected + expectedForType := make([]*rulespb.RuleGroup, len(expected)) + copy(expectedForType, expected) + if tcase.requestedType != rulespb.RulesRequest_ALL { expectedForType = make([]*rulespb.RuleGroup, len(expected)) for i, g := range expected { @@ -180,6 +184,13 @@ func testRulesAgainstExamples(t *testing.T, dir string, server rulespb.RulesServ } } + // The Prometheus API does not return groups with no rules. + if removeEmptyGroups { + expectedForType = slices.DeleteFunc(expectedForType, func(group *rulespb.RuleGroup) bool { + return len(group.Rules) == 0 + }) + } + got := groups.Groups // We don't want to be picky, just check what number and types of rules within group are. @@ -958,9 +969,12 @@ func TestDedupGroups(t *testing.T) { func TestFilterRules(t *testing.T) { for _, tc := range []struct { - name string - matcherSets [][]*labels.Matcher - groups, want []*rulespb.RuleGroup + name string + ruleNameFilter []string + ruleGroupFilter []string + fileFilter []string + matcherSets [][]*labels.Matcher + groups, want []*rulespb.RuleGroup }{ { name: "no groups", @@ -1383,9 +1397,308 @@ func TestFilterRules(t *testing.T) { }, }, }, + { + name: "single group with rule name filter", + ruleNameFilter: []string{"a1"}, + groups: []*rulespb.RuleGroup{ + { + Name: "a", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{ + {Name: "replica", Value: "1"}, + {Name: "label", Value: "foo"}, + }}, + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{ + {Name: "label", Value: "foo"}, + }}, + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{ + {Name: "otherlabel", Value: "bar"}, + }}, + }), + }, + }, + }, + want: []*rulespb.RuleGroup{ + { + Name: "a", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{ + {Name: "replica", Value: "1"}, + {Name: "label", Value: "foo"}, + }}, + }), + }, + }, + }, + }, + { + name: "two groups with group name filter", + ruleGroupFilter: []string{"group1"}, + groups: []*rulespb.RuleGroup{ + { + Name: "group1", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", + }), + }, + }, + { + Name: "group2", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + }, + }, + }, + want: []*rulespb.RuleGroup{ + { + Name: "group1", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", + }), + }, + }, + }, + }, + { + name: "two groups with group file filter", + fileFilter: []string{"group2.yml"}, + groups: []*rulespb.RuleGroup{ + { + Name: "group1", + File: "group1.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", + }), + }, + }, + { + Name: "group2", + File: "group2.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + }, + }, + }, + want: []*rulespb.RuleGroup{ + { + Name: "group2", + File: "group2.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + }, + }, + }, + }, + { + name: "one group match multiple rules", + ruleNameFilter: []string{"r1", "r2"}, + groups: []*rulespb.RuleGroup{ + { + Name: "group1", + File: "group1.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", + }), + }, + }, + { + Name: "group2", + File: "group2.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + }, + }, + }, + want: []*rulespb.RuleGroup{ + { + Name: "group1", + File: "group1.yml", + Rules: []*rulespb.Rule{ + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", + }), + }, + }, + }, + }, + { + name: "two groups with group file filter (no match)", + fileFilter: []string{"nomatch.yml"}, + groups: []*rulespb.RuleGroup{ + { + Name: "group1", + File: "group1.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", + }), + }, + }, + { + Name: "group2", + File: "group2.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + }, + }, + }, + want: []*rulespb.RuleGroup{}, + }, + { + name: "two groups with filter on group name, file and rulename", + ruleNameFilter: []string{"a1"}, + ruleGroupFilter: []string{"group1"}, + fileFilter: []string{"file1.yml"}, + groups: []*rulespb.RuleGroup{ + { + Name: "group1", + File: "file1.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", + }), + }, + }, + { + Name: "group2", + File: "file1.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + }, + }, + { + Name: "group3", + File: "file2.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + }, + }, + }, + want: []*rulespb.RuleGroup{ + { + Name: "group1", + File: "file1.yml", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + }), + }, + }, + }, + }, + { + name: "single group with labeled rules, matcher and rule name filter", + matcherSets: [][]*labels.Matcher{{&labels.Matcher{Name: "label", Value: "foo", Type: labels.MatchEqual}}}, + ruleNameFilter: []string{"a1"}, + groups: []*rulespb.RuleGroup{ + { + Name: "a", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{ + {Name: "replica", Value: "1"}, + {Name: "label", Value: "foo"}, + }}, + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r1", Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{ + {Name: "label", Value: "foo"}, + }}, + }), + rulespb.NewRecordingRule(&rulespb.RecordingRule{ + Name: "r2", Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{ + {Name: "otherlabel", Value: "bar"}, + }}, + }), + }, + }, + }, + want: []*rulespb.RuleGroup{ + { + Name: "a", + Rules: []*rulespb.Rule{ + rulespb.NewAlertingRule(&rulespb.Alert{ + Name: "a1", + Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{ + {Name: "replica", Value: "1"}, + {Name: "label", Value: "foo"}, + }}, + }), + }, + }, + }, + }, } { t.Run(tc.name, func(t *testing.T) { - testutil.Equals(t, tc.want, filterRules(tc.groups, tc.matcherSets)) + groups := filterRulesByMatchers(tc.groups, tc.matcherSets) + groups = filterRulesByNamesAndFile(groups, tc.ruleNameFilter, tc.ruleGroupFilter, tc.fileFilter) + testutil.Equals(t, tc.want, groups) }) } } diff --git a/pkg/rules/rulespb/rpc.pb.go b/pkg/rules/rulespb/rpc.pb.go index 941014a06a..298ce03063 100644 --- a/pkg/rules/rulespb/rpc.pb.go +++ b/pkg/rules/rulespb/rpc.pb.go @@ -109,6 +109,9 @@ type RulesRequest struct { Type RulesRequest_Type `protobuf:"varint,1,opt,name=type,proto3,enum=thanos.RulesRequest_Type" json:"type,omitempty"` PartialResponseStrategy storepb.PartialResponseStrategy `protobuf:"varint,2,opt,name=partial_response_strategy,json=partialResponseStrategy,proto3,enum=thanos.PartialResponseStrategy" json:"partial_response_strategy,omitempty"` MatcherString []string `protobuf:"bytes,3,rep,name=matcher_string,json=matcherString,proto3" json:"matcher_string,omitempty"` + RuleName []string `protobuf:"bytes,4,rep,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` + RuleGroup []string `protobuf:"bytes,5,rep,name=rule_group,json=ruleGroup,proto3" json:"rule_group,omitempty"` + File []string `protobuf:"bytes,6,rep,name=file,proto3" json:"file,omitempty"` } func (m *RulesRequest) Reset() { *m = RulesRequest{} } @@ -554,74 +557,76 @@ func init() { func init() { proto.RegisterFile("rules/rulespb/rpc.proto", fileDescriptor_91b1d28f30eb5efb) } var fileDescriptor_91b1d28f30eb5efb = []byte{ - // 1058 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xcd, 0x4e, 0x23, 0xc7, - 0x13, 0xf7, 0x60, 0xcf, 0xd8, 0x53, 0xc6, 0x2c, 0xdb, 0x0b, 0x62, 0x60, 0xff, 0xf2, 0x20, 0x4b, - 0xfc, 0x45, 0xa2, 0xac, 0x1d, 0x81, 0x76, 0xa3, 0x3d, 0x45, 0x98, 0x8f, 0x05, 0x09, 0x91, 0x55, - 0x1b, 0xe5, 0xb0, 0x39, 0x38, 0x8d, 0x69, 0xcc, 0x28, 0xe3, 0x99, 0xd9, 0xee, 0x36, 0x11, 0x6f, - 0xb1, 0xe7, 0xbc, 0x48, 0x5e, 0x81, 0x5b, 0xf6, 0x98, 0x93, 0x93, 0xc0, 0x29, 0x3e, 0xe4, 0x19, - 0xa2, 0xae, 0x9e, 0xb1, 0x0d, 0x81, 0xb0, 0x9b, 0x90, 0xcb, 0x54, 0x77, 0xd5, 0xaf, 0x7a, 0xea, - 0xe3, 0xd7, 0x35, 0x03, 0x0b, 0xa2, 0x1f, 0x72, 0xd9, 0xc0, 0x67, 0x72, 0xd4, 0x10, 0x49, 0xa7, - 0x9e, 0x88, 0x58, 0xc5, 0xc4, 0x51, 0xa7, 0x2c, 0x8a, 0xe5, 0xd2, 0xa2, 0x54, 0xb1, 0xe0, 0x0d, - 0x7c, 0x26, 0x47, 0x0d, 0x75, 0x9e, 0x70, 0x69, 0x20, 0x99, 0x29, 0x64, 0x47, 0x3c, 0xbc, 0x61, - 0x9a, 0xeb, 0xc6, 0xdd, 0x18, 0x97, 0x0d, 0xbd, 0x4a, 0xb5, 0x7e, 0x37, 0x8e, 0xbb, 0x21, 0x6f, - 0xe0, 0xee, 0xa8, 0x7f, 0xd2, 0x50, 0x41, 0x8f, 0x4b, 0xc5, 0x7a, 0x89, 0x01, 0xd4, 0x7e, 0xb7, - 0x60, 0x9a, 0xea, 0x50, 0x28, 0x7f, 0xdb, 0xe7, 0x52, 0x91, 0x67, 0x50, 0xd0, 0xc7, 0x7a, 0xd6, - 0xb2, 0xb5, 0x3a, 0xb3, 0xb6, 0x58, 0x37, 0x41, 0xd5, 0x27, 0x31, 0xf5, 0xc3, 0xf3, 0x84, 0x53, - 0x84, 0x91, 0x6f, 0x60, 0x31, 0x61, 0x42, 0x05, 0x2c, 0x6c, 0x0b, 0x2e, 0x93, 0x38, 0x92, 0xbc, - 0x2d, 0x95, 0x60, 0x8a, 0x77, 0xcf, 0xbd, 0x29, 0x3c, 0xc3, 0xcf, 0xce, 0x78, 0x6d, 0x80, 0x34, - 0xc5, 0xb5, 0x52, 0x18, 0x5d, 0x48, 0x6e, 0x37, 0x90, 0x15, 0x98, 0xe9, 0x31, 0xd5, 0x39, 0xe5, - 0x42, 0x9f, 0x19, 0x44, 0x5d, 0x2f, 0xbf, 0x9c, 0x5f, 0x75, 0x69, 0x25, 0xd5, 0xb6, 0x50, 0x59, - 0xfb, 0x3f, 0x14, 0x74, 0x44, 0xa4, 0x08, 0xf9, 0x8d, 0xfd, 0xfd, 0xd9, 0x1c, 0x71, 0xc1, 0xde, - 0xd8, 0xdf, 0xa6, 0x87, 0xb3, 0x16, 0x01, 0x70, 0xe8, 0xf6, 0xe6, 0x57, 0x74, 0x6b, 0x76, 0xaa, - 0xf6, 0x2d, 0x54, 0xd2, 0x34, 0xcc, 0x7b, 0xc8, 0x27, 0x60, 0x77, 0x45, 0xdc, 0x4f, 0x30, 0xd9, - 0xf2, 0xda, 0xe3, 0xc9, 0x64, 0x5f, 0x69, 0xc3, 0x6e, 0x8e, 0x1a, 0x04, 0x59, 0x82, 0xe2, 0xf7, - 0x4c, 0x44, 0x3a, 0x06, 0x9d, 0x95, 0xbb, 0x9b, 0xa3, 0x99, 0xa2, 0x59, 0x02, 0x47, 0x70, 0xd9, - 0x0f, 0x55, 0x6d, 0x13, 0x60, 0xe4, 0x2b, 0xc9, 0x73, 0x70, 0xd0, 0x59, 0x7a, 0xd6, 0x72, 0xfe, - 0xd6, 0xf3, 0x9b, 0x30, 0x1c, 0xf8, 0x29, 0x88, 0xa6, 0xb2, 0xf6, 0x47, 0x1e, 0xdc, 0x11, 0x82, - 0xfc, 0x0f, 0x0a, 0x11, 0xeb, 0x99, 0x7e, 0xb8, 0xcd, 0xd2, 0x70, 0xe0, 0xe3, 0x9e, 0xe2, 0x53, - 0x5b, 0x4f, 0x82, 0x90, 0x9b, 0x98, 0x8c, 0x55, 0xef, 0x29, 0x3e, 0xc9, 0x33, 0xb0, 0x91, 0x66, - 0x58, 0xb6, 0xf2, 0xda, 0xf4, 0xe4, 0xfb, 0x9b, 0xee, 0x70, 0xe0, 0x1b, 0x33, 0x35, 0x82, 0xac, - 0x42, 0x29, 0x88, 0x14, 0x17, 0x67, 0x2c, 0xf4, 0x0a, 0xcb, 0xd6, 0xaa, 0xd5, 0x9c, 0x1e, 0x0e, - 0xfc, 0x91, 0x8e, 0x8e, 0x56, 0x84, 0xc2, 0x53, 0x7e, 0xc6, 0xc2, 0x3e, 0x53, 0x41, 0x1c, 0xb5, - 0x8f, 0xfb, 0xc2, 0x2c, 0x24, 0xef, 0xc4, 0xd1, 0xb1, 0xf4, 0x6c, 0x74, 0x26, 0xc3, 0x81, 0x3f, - 0x33, 0x86, 0x1d, 0x06, 0x3d, 0x4e, 0x17, 0xc7, 0xfb, 0xad, 0xd4, 0xab, 0x65, 0x9c, 0x48, 0x1b, - 0x1e, 0x85, 0x4c, 0xaa, 0xf6, 0x18, 0xe1, 0x39, 0xd8, 0x96, 0xa5, 0xba, 0x21, 0x71, 0x3d, 0x23, - 0x71, 0xfd, 0x30, 0x23, 0x71, 0x73, 0xe9, 0x62, 0xe0, 0xe7, 0xf4, 0x7b, 0xb4, 0xeb, 0xf6, 0xc8, - 0xf3, 0xdd, 0x2f, 0xbe, 0x45, 0x6f, 0xe8, 0x88, 0x0f, 0x76, 0x18, 0xf4, 0x02, 0xe5, 0xb9, 0xcb, - 0xd6, 0x6a, 0xde, 0xe4, 0x8f, 0x0a, 0x6a, 0x04, 0x39, 0x83, 0x85, 0x3b, 0x28, 0xea, 0x95, 0x3e, - 0x88, 0xc9, 0xcd, 0xa7, 0xc3, 0x81, 0x7f, 0x17, 0x9b, 0xe9, 0x5d, 0x87, 0xd7, 0x22, 0x28, 0xe8, - 0x8e, 0x90, 0xe7, 0xe0, 0x0a, 0xde, 0x89, 0xc5, 0xb1, 0x66, 0x99, 0xa1, 0xe4, 0xfc, 0xa8, 0x65, - 0x99, 0x41, 0x23, 0x77, 0x73, 0x74, 0x8c, 0x24, 0x2b, 0x60, 0xb3, 0x90, 0x0b, 0x85, 0x24, 0x28, - 0xaf, 0x55, 0x32, 0x97, 0x0d, 0xad, 0xd4, 0x0c, 0x46, 0xeb, 0x04, 0x4b, 0x7f, 0xcc, 0x43, 0x05, - 0x8d, 0x7b, 0x91, 0x54, 0x2c, 0xea, 0x70, 0xf2, 0x12, 0x1c, 0x9c, 0x29, 0xf2, 0xe6, 0x4d, 0x78, - 0xb3, 0xaf, 0xd5, 0x2d, 0xae, 0x9a, 0x33, 0x69, 0xa5, 0x53, 0x20, 0x4d, 0x25, 0xd9, 0x85, 0x32, - 0x8b, 0xa2, 0x58, 0x61, 0x8d, 0x65, 0x1a, 0xc3, 0x2d, 0xfe, 0x4f, 0x52, 0xff, 0x49, 0x34, 0x9d, - 0xdc, 0x90, 0x75, 0xb0, 0xa5, 0x62, 0x8a, 0x7b, 0x79, 0x2c, 0x36, 0xb9, 0x96, 0x47, 0x4b, 0x5b, - 0x4c, 0xcf, 0x10, 0x44, 0x8d, 0x20, 0x2d, 0x70, 0x59, 0x47, 0x05, 0x67, 0xbc, 0xcd, 0x14, 0x92, - 0xf6, 0x1e, 0xbe, 0x0c, 0x07, 0x3e, 0x31, 0x0e, 0x1b, 0xea, 0xb3, 0xb8, 0x17, 0x28, 0xde, 0x4b, - 0xd4, 0x39, 0xf2, 0xa5, 0x94, 0xe9, 0x35, 0x53, 0x34, 0x6d, 0x38, 0x12, 0xd9, 0x35, 0x6f, 0x45, - 0x05, 0x35, 0xe2, 0xef, 0x98, 0xe2, 0xfc, 0x97, 0x4c, 0xf9, 0xc9, 0x06, 0x1b, 0xcb, 0x31, 0x2e, - 0x96, 0xf5, 0x11, 0xc5, 0xca, 0x66, 0xc9, 0xd4, 0xad, 0xb3, 0xc4, 0x07, 0xfb, 0x6d, 0x9f, 0x8b, - 0x73, 0xac, 0x7f, 0x9a, 0x35, 0x2a, 0xa8, 0x11, 0xe4, 0x0b, 0x98, 0xfd, 0xcb, 0x55, 0x9f, 0x98, - 0x13, 0x99, 0x8d, 0x3e, 0x3a, 0xbe, 0x71, 0xb5, 0xc7, 0xf4, 0xb2, 0xff, 0x25, 0xbd, 0x9c, 0x7f, - 0x4e, 0xaf, 0x97, 0xe0, 0xe0, 0x45, 0x90, 0x5e, 0x11, 0xa7, 0xe1, 0xfc, 0xb5, 0x92, 0x65, 0x57, - 0xc1, 0x4c, 0x64, 0x03, 0xa4, 0xa9, 0x24, 0x35, 0x70, 0x4e, 0x39, 0x0b, 0xd5, 0x29, 0xce, 0x01, - 0xd7, 0x60, 0x8c, 0x86, 0xa6, 0x92, 0xbc, 0x00, 0x30, 0xe3, 0x4b, 0x88, 0x58, 0xe0, 0x88, 0x71, - 0x9b, 0x0b, 0xc3, 0x81, 0xff, 0x04, 0xa7, 0x90, 0x56, 0x8e, 0xe9, 0x46, 0xdd, 0x91, 0xf2, 0xbe, - 0x51, 0x0a, 0x0f, 0x34, 0x4a, 0xcb, 0x0f, 0x3a, 0x4a, 0x77, 0x61, 0xe1, 0x3b, 0xce, 0x93, 0xf6, - 0x49, 0xa0, 0x3f, 0xc0, 0xed, 0x93, 0x58, 0x8c, 0x02, 0x9e, 0xc6, 0x80, 0x1f, 0x0f, 0x07, 0x7e, - 0x45, 0x43, 0x76, 0x10, 0xb1, 0x13, 0x0b, 0x3a, 0x77, 0x6d, 0x9b, 0x86, 0x5a, 0xfb, 0x21, 0x0f, - 0x95, 0x6b, 0xb3, 0xed, 0x9e, 0x0f, 0xde, 0x88, 0xa4, 0x53, 0x77, 0x90, 0x74, 0xcc, 0xb5, 0xfc, - 0xc7, 0x72, 0x6d, 0xdc, 0xe6, 0xc2, 0x07, 0xb6, 0xd9, 0x7e, 0xa8, 0x36, 0x3b, 0x0f, 0xd4, 0xe6, - 0xe2, 0x43, 0xb6, 0xf9, 0xd3, 0x75, 0x80, 0xf1, 0x3c, 0x21, 0xd3, 0x50, 0xda, 0x3b, 0xd8, 0xd8, - 0x3c, 0xdc, 0xfb, 0x7a, 0x7b, 0x36, 0x47, 0xca, 0x50, 0x7c, 0xbd, 0x7d, 0xb0, 0xb5, 0x77, 0xf0, - 0xca, 0xfc, 0x65, 0xed, 0xec, 0x51, 0xbd, 0x9e, 0x5a, 0xfb, 0x12, 0x6c, 0xfc, 0xcb, 0x22, 0x2f, - 0xb2, 0xc5, 0xdc, 0x6d, 0x3f, 0x91, 0x4b, 0xf3, 0x37, 0xb4, 0x66, 0xd4, 0x7d, 0x6e, 0x35, 0x57, - 0x2e, 0x7e, 0xab, 0xe6, 0x2e, 0x2e, 0xab, 0xd6, 0xfb, 0xcb, 0xaa, 0xf5, 0xeb, 0x65, 0xd5, 0x7a, - 0x77, 0x55, 0xcd, 0xbd, 0xbf, 0xaa, 0xe6, 0x7e, 0xbe, 0xaa, 0xe6, 0xde, 0x14, 0xd3, 0x1f, 0xe7, - 0x23, 0x07, 0x93, 0x5b, 0xff, 0x33, 0x00, 0x00, 0xff, 0xff, 0xeb, 0xed, 0x6d, 0x27, 0x50, 0x0b, - 0x00, 0x00, + // 1096 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0xcd, 0x4e, 0x23, 0x47, + 0x10, 0xf6, 0xd8, 0x9e, 0xb1, 0xa7, 0x8c, 0x59, 0xb6, 0x17, 0xc4, 0x00, 0x89, 0x07, 0x59, 0x22, + 0x22, 0x51, 0xd6, 0x8e, 0x40, 0xbb, 0xd1, 0x9e, 0x22, 0xcc, 0xcf, 0x82, 0x84, 0xc8, 0xaa, 0x8d, + 0x72, 0xd8, 0x1c, 0x9c, 0xc6, 0x34, 0x66, 0x94, 0xf1, 0xcc, 0x6c, 0x4f, 0x9b, 0x88, 0xb7, 0xd8, + 0x73, 0x5e, 0x24, 0xca, 0x1b, 0x70, 0xcb, 0x1e, 0x73, 0x72, 0x12, 0xb8, 0xf9, 0x90, 0x67, 0x88, + 0xba, 0x7a, 0xc6, 0x63, 0x08, 0x84, 0xdd, 0x84, 0x5c, 0xdc, 0xdd, 0x5f, 0x7d, 0xd5, 0x3f, 0x55, + 0x5f, 0x95, 0x07, 0xe6, 0xc5, 0xc0, 0xe7, 0x71, 0x13, 0x7f, 0xa3, 0xa3, 0xa6, 0x88, 0xba, 0x8d, + 0x48, 0x84, 0x32, 0x24, 0x96, 0x3c, 0x65, 0x41, 0x18, 0x2f, 0x2e, 0xc4, 0x32, 0x14, 0xbc, 0x89, + 0xbf, 0xd1, 0x51, 0x53, 0x9e, 0x47, 0x3c, 0xd6, 0x94, 0xd4, 0xe4, 0xb3, 0x23, 0xee, 0xdf, 0x30, + 0xcd, 0xf6, 0xc2, 0x5e, 0x88, 0xd3, 0xa6, 0x9a, 0x25, 0xa8, 0xdb, 0x0b, 0xc3, 0x9e, 0xcf, 0x9b, + 0xb8, 0x3a, 0x1a, 0x9c, 0x34, 0xa5, 0xd7, 0xe7, 0xb1, 0x64, 0xfd, 0x48, 0x13, 0xea, 0x3f, 0xe7, + 0x61, 0x8a, 0xaa, 0xab, 0x50, 0xfe, 0x66, 0xc0, 0x63, 0x49, 0x9e, 0x42, 0x51, 0x6d, 0xeb, 0x18, + 0xcb, 0xc6, 0xea, 0xf4, 0xda, 0x42, 0x43, 0x5f, 0xaa, 0x31, 0xc9, 0x69, 0x1c, 0x9e, 0x47, 0x9c, + 0x22, 0x8d, 0x7c, 0x0b, 0x0b, 0x11, 0x13, 0xd2, 0x63, 0x7e, 0x47, 0xf0, 0x38, 0x0a, 0x83, 0x98, + 0x77, 0x62, 0x29, 0x98, 0xe4, 0xbd, 0x73, 0x27, 0x8f, 0x7b, 0xb8, 0xe9, 0x1e, 0xaf, 0x34, 0x91, + 0x26, 0xbc, 0x76, 0x42, 0xa3, 0xf3, 0xd1, 0xed, 0x06, 0xb2, 0x02, 0xd3, 0x7d, 0x26, 0xbb, 0xa7, + 0x5c, 0xa8, 0x3d, 0xbd, 0xa0, 0xe7, 0x14, 0x96, 0x0b, 0xab, 0x36, 0xad, 0x26, 0x68, 0x1b, 0x41, + 0xb2, 0x04, 0xb6, 0x8a, 0x66, 0x27, 0x60, 0x7d, 0xee, 0x14, 0x91, 0x51, 0x56, 0xc0, 0x01, 0xeb, + 0x73, 0xf2, 0x31, 0x00, 0x1a, 0x7b, 0x22, 0x1c, 0x44, 0x8e, 0x89, 0x56, 0xa4, 0xbf, 0x54, 0x00, + 0x21, 0x50, 0x3c, 0xf1, 0x7c, 0xee, 0x58, 0x68, 0xc0, 0x79, 0xfd, 0x13, 0x28, 0xaa, 0x17, 0x92, + 0x12, 0x14, 0x36, 0xf6, 0xf7, 0x67, 0x72, 0xc4, 0x06, 0x73, 0x63, 0x7f, 0x9b, 0x1e, 0xce, 0x18, + 0x04, 0xc0, 0xa2, 0xdb, 0x9b, 0x5f, 0xd3, 0xad, 0x99, 0x7c, 0xfd, 0x3b, 0xa8, 0x26, 0x61, 0xd1, + 0xf7, 0x26, 0x9f, 0x82, 0xa9, 0x8f, 0x51, 0xc1, 0xab, 0xac, 0x3d, 0x9e, 0x0c, 0x1e, 0x1e, 0xb7, + 0x9b, 0xa3, 0x9a, 0x41, 0x16, 0xa1, 0xf4, 0x03, 0x13, 0x81, 0x7a, 0x93, 0x8a, 0x92, 0xbd, 0x9b, + 0xa3, 0x29, 0xd0, 0x2a, 0x83, 0x25, 0x78, 0x3c, 0xf0, 0x65, 0x7d, 0x13, 0x60, 0xec, 0x1b, 0x93, + 0x67, 0x60, 0xa1, 0x73, 0xec, 0x18, 0xcb, 0x85, 0x5b, 0xf7, 0x6f, 0xc1, 0x68, 0xe8, 0x26, 0x24, + 0x9a, 0x8c, 0xf5, 0x3f, 0x0b, 0x60, 0x8f, 0x19, 0xe4, 0x23, 0x28, 0x62, 0x9c, 0xd4, 0x15, 0xed, + 0x56, 0x79, 0x34, 0x74, 0x71, 0x4d, 0xf1, 0x57, 0x59, 0x31, 0x1c, 0xf9, 0xcc, 0xaa, 0xd6, 0x3a, + 0x30, 0xe4, 0x29, 0x98, 0x28, 0x5b, 0x4c, 0x43, 0x65, 0x6d, 0x6a, 0xf2, 0xfc, 0x96, 0x3d, 0x1a, + 0xba, 0xda, 0x4c, 0xf5, 0x40, 0x56, 0xa1, 0xec, 0x05, 0x92, 0x8b, 0x33, 0xe6, 0x3b, 0xc5, 0x65, + 0x63, 0xd5, 0x68, 0x4d, 0x8d, 0x86, 0xee, 0x18, 0xa3, 0xe3, 0x19, 0xa1, 0xb0, 0xc4, 0xcf, 0x98, + 0x3f, 0x60, 0xd2, 0x0b, 0x83, 0xce, 0xf1, 0x40, 0xe8, 0x49, 0xcc, 0xbb, 0x61, 0x70, 0x1c, 0x3b, + 0x26, 0x3a, 0x93, 0xd1, 0xd0, 0x9d, 0xce, 0x68, 0x87, 0x5e, 0x9f, 0xd3, 0x85, 0x6c, 0xbd, 0x95, + 0x78, 0xb5, 0xb5, 0x13, 0xe9, 0xc0, 0x23, 0x9f, 0xc5, 0xb2, 0x93, 0x31, 0x1c, 0x0b, 0xd3, 0xb2, + 0xd8, 0xd0, 0x45, 0xd1, 0x48, 0x8b, 0xa2, 0x71, 0x98, 0x16, 0x45, 0x6b, 0xf1, 0x62, 0xe8, 0xe6, + 0xd4, 0x39, 0xca, 0x75, 0x7b, 0xec, 0xf9, 0xf6, 0x37, 0xd7, 0xa0, 0x37, 0x30, 0xe2, 0x82, 0xe9, + 0x7b, 0x7d, 0x4f, 0x3a, 0xf6, 0xb2, 0xb1, 0x5a, 0xd0, 0xef, 0x47, 0x80, 0xea, 0x81, 0x9c, 0xc1, + 0xfc, 0x1d, 0x92, 0x77, 0xca, 0xef, 0x55, 0x19, 0xad, 0xa5, 0xd1, 0xd0, 0xbd, 0xab, 0x3a, 0xe8, + 0x5d, 0x9b, 0xd7, 0x03, 0x28, 0xaa, 0x8c, 0x90, 0x67, 0x60, 0x0b, 0xde, 0x0d, 0xc5, 0xb1, 0x52, + 0x99, 0x96, 0xe4, 0xdc, 0x38, 0x65, 0xa9, 0x41, 0x31, 0x77, 0x73, 0x34, 0x63, 0x92, 0x15, 0x30, + 0x99, 0xcf, 0x85, 0x44, 0x11, 0x54, 0xd6, 0xaa, 0xa9, 0xcb, 0x86, 0x02, 0x95, 0x82, 0xd1, 0x3a, + 0xa1, 0xd2, 0x9f, 0x0a, 0x50, 0x45, 0xe3, 0x5e, 0x10, 0x4b, 0x16, 0x74, 0x39, 0x79, 0x01, 0x16, + 0xf6, 0xa8, 0xf8, 0x66, 0x25, 0xbc, 0xde, 0x57, 0x70, 0x9b, 0xcb, 0xd6, 0x74, 0x12, 0xe9, 0x84, + 0x48, 0x93, 0x91, 0xec, 0x42, 0x85, 0x05, 0x41, 0x28, 0x31, 0xc6, 0x71, 0x72, 0x87, 0x5b, 0xfc, + 0x9f, 0x24, 0xfe, 0x93, 0x6c, 0x3a, 0xb9, 0x20, 0xeb, 0x60, 0xc6, 0x92, 0x49, 0xee, 0x14, 0x30, + 0xd8, 0xe4, 0xda, 0x3b, 0xda, 0xca, 0xa2, 0x73, 0x86, 0x24, 0xaa, 0x07, 0xd2, 0x06, 0x9b, 0x75, + 0xa5, 0x77, 0xc6, 0x3b, 0x4c, 0xa2, 0x68, 0xef, 0xd1, 0xcb, 0x68, 0xe8, 0x12, 0xed, 0xb0, 0x21, + 0x3f, 0x0f, 0xfb, 0x9e, 0xe4, 0xfd, 0x48, 0x9e, 0xa3, 0x5e, 0xca, 0x29, 0xae, 0x94, 0xa2, 0x64, + 0xc3, 0x51, 0xc8, 0xb6, 0x3e, 0x15, 0x01, 0xaa, 0x87, 0x7f, 0x52, 0x8a, 0xf5, 0x7f, 0x2a, 0xe5, + 0x17, 0x13, 0x4c, 0x0c, 0x47, 0x16, 0x2c, 0xe3, 0x03, 0x82, 0x95, 0xf6, 0x92, 0xfc, 0xad, 0xbd, + 0xc4, 0x05, 0xf3, 0xcd, 0x80, 0x8b, 0x73, 0x8c, 0x7f, 0xf2, 0x6a, 0x04, 0xa8, 0x1e, 0xc8, 0x97, + 0x30, 0xf3, 0xb7, 0x52, 0x9f, 0xe8, 0x13, 0xa9, 0x8d, 0x3e, 0x3a, 0xbe, 0x51, 0xda, 0x99, 0xbc, + 0xcc, 0xff, 0x28, 0x2f, 0xeb, 0xdf, 0xcb, 0xeb, 0x05, 0x58, 0x58, 0x08, 0xb1, 0x53, 0xc2, 0x6e, + 0x38, 0x77, 0x2d, 0x64, 0x69, 0x29, 0xe8, 0x8e, 0xac, 0x89, 0x34, 0x19, 0x49, 0x1d, 0xac, 0x53, + 0xce, 0x7c, 0x79, 0x8a, 0x7d, 0xc0, 0xd6, 0x1c, 0x8d, 0xd0, 0x64, 0x24, 0xcf, 0x01, 0x74, 0xfb, + 0x12, 0x22, 0x14, 0xd8, 0x62, 0xec, 0xd6, 0xfc, 0x68, 0xe8, 0x3e, 0xc1, 0x2e, 0xa4, 0xc0, 0x4c, + 0x6e, 0xd4, 0x1e, 0x83, 0xf7, 0xb5, 0x52, 0x78, 0xa0, 0x56, 0x5a, 0x79, 0xd0, 0x56, 0xba, 0x0b, + 0xf3, 0xdf, 0x73, 0x1e, 0x75, 0x4e, 0x3c, 0xf5, 0x87, 0xde, 0x39, 0x09, 0xc5, 0xf8, 0xc2, 0x53, + 0x78, 0xe1, 0xc7, 0xa3, 0xa1, 0x5b, 0x55, 0x94, 0x1d, 0x64, 0xec, 0x84, 0x82, 0xce, 0x5e, 0x5b, + 0x26, 0x57, 0xad, 0xff, 0x58, 0x80, 0xea, 0xb5, 0xde, 0x76, 0xcf, 0x1f, 0xde, 0x58, 0xa4, 0xf9, + 0x3b, 0x44, 0x9a, 0x69, 0xad, 0xf0, 0xa1, 0x5a, 0xcb, 0xd2, 0x5c, 0x7c, 0xcf, 0x34, 0x9b, 0x0f, + 0x95, 0x66, 0xeb, 0x81, 0xd2, 0x5c, 0x7a, 0xc8, 0x34, 0x7f, 0xb6, 0x0e, 0x90, 0xf5, 0x13, 0x32, + 0x05, 0xe5, 0xbd, 0x83, 0x8d, 0xcd, 0xc3, 0xbd, 0x6f, 0xb6, 0x67, 0x72, 0xa4, 0x02, 0xa5, 0x57, + 0xdb, 0x07, 0x5b, 0x7b, 0x07, 0x2f, 0xf5, 0x57, 0xd6, 0xce, 0x1e, 0x55, 0xf3, 0xfc, 0xda, 0x57, + 0x60, 0xe2, 0x57, 0x16, 0x79, 0x9e, 0x4e, 0x66, 0x6f, 0xfb, 0x28, 0x5d, 0x9c, 0xbb, 0x81, 0xea, + 0x56, 0xf7, 0x85, 0xd1, 0x5a, 0xb9, 0xf8, 0xa3, 0x96, 0xbb, 0xb8, 0xac, 0x19, 0xef, 0x2e, 0x6b, + 0xc6, 0xef, 0x97, 0x35, 0xe3, 0xed, 0x55, 0x2d, 0xf7, 0xee, 0xaa, 0x96, 0xfb, 0xf5, 0xaa, 0x96, + 0x7b, 0x5d, 0x4a, 0x3e, 0xc4, 0x8f, 0x2c, 0x7c, 0xdc, 0xfa, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, + 0xa0, 0xc1, 0xf7, 0x10, 0xa0, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -755,6 +760,33 @@ func (m *RulesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.File) > 0 { + for iNdEx := len(m.File) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.File[iNdEx]) + copy(dAtA[i:], m.File[iNdEx]) + i = encodeVarintRpc(dAtA, i, uint64(len(m.File[iNdEx]))) + i-- + dAtA[i] = 0x32 + } + } + if len(m.RuleGroup) > 0 { + for iNdEx := len(m.RuleGroup) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.RuleGroup[iNdEx]) + copy(dAtA[i:], m.RuleGroup[iNdEx]) + i = encodeVarintRpc(dAtA, i, uint64(len(m.RuleGroup[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if len(m.RuleName) > 0 { + for iNdEx := len(m.RuleName) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.RuleName[iNdEx]) + copy(dAtA[i:], m.RuleName[iNdEx]) + i = encodeVarintRpc(dAtA, i, uint64(len(m.RuleName[iNdEx]))) + i-- + dAtA[i] = 0x22 + } + } if len(m.MatcherString) > 0 { for iNdEx := len(m.MatcherString) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.MatcherString[iNdEx]) @@ -1326,6 +1358,24 @@ func (m *RulesRequest) Size() (n int) { n += 1 + l + sovRpc(uint64(l)) } } + if len(m.RuleName) > 0 { + for _, s := range m.RuleName { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + if len(m.RuleGroup) > 0 { + for _, s := range m.RuleGroup { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } + if len(m.File) > 0 { + for _, s := range m.File { + l = len(s) + n += 1 + l + sovRpc(uint64(l)) + } + } return n } @@ -1664,6 +1714,102 @@ func (m *RulesRequest) Unmarshal(dAtA []byte) error { } m.MatcherString = append(m.MatcherString, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RuleName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RuleName = append(m.RuleName, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RuleGroup", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RuleGroup = append(m.RuleGroup, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field File", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthRpc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.File = append(m.File, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) diff --git a/pkg/rules/rulespb/rpc.proto b/pkg/rules/rulespb/rpc.proto index 25d809ede9..f5fc8a038b 100644 --- a/pkg/rules/rulespb/rpc.proto +++ b/pkg/rules/rulespb/rpc.proto @@ -41,6 +41,9 @@ message RulesRequest { Type type = 1; PartialResponseStrategy partial_response_strategy = 2; repeated string matcher_string = 3; + repeated string rule_name = 4; + repeated string rule_group = 5; + repeated string file = 6; } message RulesResponse { diff --git a/pkg/runutil/runutil.go b/pkg/runutil/runutil.go index 809dfce36b..9aaeeca615 100644 --- a/pkg/runutil/runutil.go +++ b/pkg/runutil/runutil.go @@ -3,7 +3,7 @@ // Package runutil provides helpers to advanced function scheduling control like repeat or retry. // -// It's very often the case when you need to excutes some code every fixed intervals or have it retried automatically. +// It's very often the case when you need to executes some code every fixed intervals or have it retried automatically. // To make it reliably with proper timeout, you need to carefully arrange some boilerplate for this. // Below function does it for you. // diff --git a/pkg/server/grpc/grpc.go b/pkg/server/grpc/grpc.go index b123fe7bdf..57b063d9b0 100644 --- a/pkg/server/grpc/grpc.go +++ b/pkg/server/grpc/grpc.go @@ -9,14 +9,14 @@ import ( "net" "runtime/debug" + "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors" + "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/selector" + "github.com/go-kit/log" "github.com/go-kit/log/level" - "github.com/grpc-ecosystem/go-grpc-middleware/providers/kit/v2" - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware/v2" + grpc_prometheus "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus" grpc_logging "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/recovery" - "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tags" - grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" @@ -30,6 +30,7 @@ import ( "google.golang.org/grpc/status" "github.com/thanos-io/thanos/pkg/component" + logging_mw "github.com/thanos-io/thanos/pkg/logging" "github.com/thanos-io/thanos/pkg/prober" "github.com/thanos-io/thanos/pkg/tracing" ) @@ -47,7 +48,7 @@ type Server struct { // New creates a new gRPC Store API. // If rulesSrv is not nil, it also registers Rules API to the returned server. -func New(logger log.Logger, reg prometheus.Registerer, tracer opentracing.Tracer, logOpts []grpc_logging.Option, tagsOpts []tags.Option, comp component.Component, probe *prober.GRPCProbe, opts ...Option) *Server { +func New(logger log.Logger, reg prometheus.Registerer, tracer opentracing.Tracer, logOpts []grpc_logging.Option, logFilterMethods []string, comp component.Component, probe *prober.GRPCProbe, opts ...Option) *Server { logger = log.With(logger, "service", "gRPC/server", "component", comp.String()) options := options{ network: "tcp", @@ -56,10 +57,16 @@ func New(logger log.Logger, reg prometheus.Registerer, tracer opentracing.Tracer o.apply(&options) } - met := grpc_prometheus.NewServerMetrics() - met.EnableHandlingTimeHistogram( - grpc_prometheus.WithHistogramBuckets([]float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}), + met := grpc_prometheus.NewServerMetrics( + grpc_prometheus.WithServerHandlingTimeHistogram( + grpc_prometheus.WithHistogramOpts(&prometheus.HistogramOpts{ + Buckets: []float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120}, + NativeHistogramMaxBucketNumber: 256, + NativeHistogramBucketFactor: 1.1, + }), + ), ) + panicsTotal := promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "grpc_req_panics_recovered_total", Help: "Total number of gRPC requests recovered from internal panic.", @@ -77,19 +84,48 @@ func New(logger log.Logger, reg prometheus.Registerer, tracer opentracing.Tracer // TODO(bwplotka): https://github.com/grpc-ecosystem/go-grpc-middleware/issues/462 grpc.MaxSendMsgSize(math.MaxInt32), grpc.MaxRecvMsgSize(math.MaxInt32), - grpc_middleware.WithUnaryServerChain( + grpc.ChainUnaryInterceptor( + NewUnaryServerRequestIDInterceptor(), grpc_recovery.UnaryServerInterceptor(grpc_recovery.WithRecoveryHandler(grpcPanicRecoveryHandler)), met.UnaryServerInterceptor(), - tags.UnaryServerInterceptor(tagsOpts...), tracing.UnaryServerInterceptor(tracer), - grpc_logging.UnaryServerInterceptor(kit.InterceptorLogger(logger), logOpts...), + selector.UnaryServerInterceptor(grpc_logging.UnaryServerInterceptor(logging_mw.InterceptorLogger(logger), logOpts...), selector.MatchFunc(func(ctx context.Context, c interceptors.CallMeta) bool { + //if RequestConfig.GRPC.Config was provided + for _, m := range logFilterMethods { + if m == c.FullMethod() { + return true + } + } + return false + })), + selector.UnaryServerInterceptor(grpc_logging.UnaryServerInterceptor(logging_mw.InterceptorLogger(logger), logOpts...), selector.MatchFunc(func(ctx context.Context, _ interceptors.CallMeta) bool { + //if RequestConfig.Options only was provided + if len(logFilterMethods) == 0 && logOpts != nil { + return true + } + return false + })), ), - grpc_middleware.WithStreamServerChain( + + grpc.ChainStreamInterceptor( + NewStreamServerRequestIDInterceptor(), grpc_recovery.StreamServerInterceptor(grpc_recovery.WithRecoveryHandler(grpcPanicRecoveryHandler)), met.StreamServerInterceptor(), - tags.StreamServerInterceptor(tagsOpts...), tracing.StreamServerInterceptor(tracer), - grpc_logging.StreamServerInterceptor(kit.InterceptorLogger(logger), logOpts...), + selector.StreamServerInterceptor(grpc_logging.StreamServerInterceptor(logging_mw.InterceptorLogger(logger), logOpts...), selector.MatchFunc(func(ctx context.Context, c interceptors.CallMeta) bool { + for _, m := range logFilterMethods { + if m == c.FullMethod() { + return true + } + } + return false + })), + selector.StreamServerInterceptor(grpc_logging.StreamServerInterceptor(logging_mw.InterceptorLogger(logger), logOpts...), selector.MatchFunc(func(ctx context.Context, _ interceptors.CallMeta) bool { + if len(logFilterMethods) == 0 && logOpts != nil { + return true + } + return false + })), ), }...) diff --git a/pkg/server/grpc/request_id.go b/pkg/server/grpc/request_id.go new file mode 100644 index 0000000000..cca8175516 --- /dev/null +++ b/pkg/server/grpc/request_id.go @@ -0,0 +1,67 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package grpc + +import ( + "context" + + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" + + "github.com/thanos-io/thanos/pkg/server/http/middleware" +) + +const requestIDKey = "request-id" + +func NewUnaryClientRequestIDInterceptor() grpc.UnaryClientInterceptor { + return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + reqID, ok := middleware.RequestIDFromContext(ctx) + if ok { + ctx = metadata.AppendToOutgoingContext(ctx, requestIDKey, reqID) + } + return invoker(ctx, method, req, reply, cc, opts...) + } +} + +func NewUnaryServerRequestIDInterceptor() grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { + if vals := metadata.ValueFromIncomingContext(ctx, requestIDKey); len(vals) == 1 { + ctx = middleware.NewContextWithRequestID(ctx, vals[0]) + } + return handler(ctx, req) + } +} + +func NewStreamClientRequestIDInterceptor() grpc.StreamClientInterceptor { + return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { + reqID, ok := middleware.RequestIDFromContext(ctx) + if ok { + ctx = metadata.AppendToOutgoingContext(ctx, requestIDKey, reqID) + } + return streamer(ctx, desc, cc, method, opts...) + } +} + +func NewStreamServerRequestIDInterceptor() grpc.StreamServerInterceptor { + return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + if vals := metadata.ValueFromIncomingContext(ss.Context(), requestIDKey); len(vals) == 1 { + ctx := middleware.NewContextWithRequestID(ss.Context(), vals[0]) + return handler(srv, newStreamWithContext(ctx, ss)) + } + return handler(srv, ss) + } +} + +type streamWithContext struct { + grpc.ServerStream + ctx context.Context +} + +func newStreamWithContext(ctx context.Context, serverStream grpc.ServerStream) *streamWithContext { + return &streamWithContext{ServerStream: serverStream, ctx: ctx} +} + +func (s streamWithContext) Context() context.Context { + return s.ctx +} diff --git a/pkg/server/http/middleware/request_id.go b/pkg/server/http/middleware/request_id.go index fddeabf932..3a3da07a83 100644 --- a/pkg/server/http/middleware/request_id.go +++ b/pkg/server/http/middleware/request_id.go @@ -16,8 +16,8 @@ type ctxKey int const reqIDKey = ctxKey(0) -// newContextWithRequestID creates a context with a request id. -func newContextWithRequestID(ctx context.Context, rid string) context.Context { +// NewContextWithRequestID creates a context with a request id. +func NewContextWithRequestID(ctx context.Context, rid string) context.Context { return context.WithValue(ctx, reqIDKey, rid) } @@ -36,7 +36,7 @@ func RequestID(h http.Handler) http.HandlerFunc { reqID = ulid.MustNew(ulid.Timestamp(time.Now()), entropy).String() r.Header.Set("X-Request-ID", reqID) } - ctx := newContextWithRequestID(r.Context(), reqID) + ctx := NewContextWithRequestID(r.Context(), reqID) h.ServeHTTP(w, r.WithContext(ctx)) } } diff --git a/pkg/store/acceptance_test.go b/pkg/store/acceptance_test.go index d0921be50a..48fc00adfb 100644 --- a/pkg/store/acceptance_test.go +++ b/pkg/store/acceptance_test.go @@ -41,6 +41,10 @@ import ( "github.com/thanos-io/thanos/pkg/testutil/e2eutil" ) +func TestMain(m *testing.M) { + custom.TolerantVerifyLeakMain(m) +} + type labelNameCallCase struct { matchers []storepb.LabelMatcher start int64 @@ -712,6 +716,74 @@ func testStoreAPIsAcceptance(t *testing.T, startStore startStoreFn) { }, }, }, + { + desc: "label values and names with non-equal matchers on external labels", + appendFn: func(app storage.Appender) { + _, err := app.Append(0, labels.FromStrings("__name__", "up", "foo", "bar"), 0, 0) + testutil.Ok(t, err) + testutil.Ok(t, app.Commit()) + }, + labelNameCalls: []labelNameCallCase{ + { + start: timestamp.FromTime(minTime), + end: timestamp.FromTime(maxTime), + expectedNames: []string{"__name__", "foo", "region"}, + matchers: []storepb.LabelMatcher{{Type: storepb.LabelMatcher_RE, Name: "region", Value: ".*"}}, + }, + }, + labelValuesCalls: []labelValuesCallCase{ + { + start: timestamp.FromTime(minTime), + end: timestamp.FromTime(maxTime), + label: "region", + matchers: []storepb.LabelMatcher{ + {Type: storepb.LabelMatcher_EQ, Name: "__name__", Value: "up"}, + {Type: storepb.LabelMatcher_RE, Name: "region", Value: ".*"}, + }, + expectedValues: []string{"eu-west"}, + }, + }, + }, + { + desc: "label_values(kube_pod_info{}, pod) don't fetch postings for pod!=''", + appendFn: func(app storage.Appender) { + _, err := app.Append(0, labels.FromStrings("__name__", "up", "pod", "pod-1"), timestamp.FromTime(now), 1) + testutil.Ok(t, err) + _, err = app.Append(0, labels.FromStrings("__name__", "up", "pod", "pod-2"), timestamp.FromTime(now), 1) + testutil.Ok(t, err) + _, err = app.Append(0, labels.FromStrings("__name__", "kube_pod_info", "pod", "pod-1"), timestamp.FromTime(now), 1) + testutil.Ok(t, err) + testutil.Ok(t, app.Commit()) + }, + labelNameCalls: []labelNameCallCase{ + { + start: timestamp.FromTime(minTime), + end: timestamp.FromTime(maxTime), + expectedNames: []string{"__name__", "pod", "region"}, + matchers: []storepb.LabelMatcher{{Type: storepb.LabelMatcher_EQ, Name: "__name__", Value: "kube_pod_info"}}, + }, + { + start: timestamp.FromTime(minTime), + end: timestamp.FromTime(maxTime), + expectedNames: []string{"__name__", "pod", "region"}, + }, + }, + labelValuesCalls: []labelValuesCallCase{ + { + start: timestamp.FromTime(minTime), + end: timestamp.FromTime(maxTime), + label: "pod", + expectedValues: []string{"pod-1"}, + matchers: []storepb.LabelMatcher{{Type: storepb.LabelMatcher_EQ, Name: "__name__", Value: "kube_pod_info"}}, + }, + { + start: timestamp.FromTime(minTime), + end: timestamp.FromTime(maxTime), + label: "pod", + expectedValues: []string{"pod-1", "pod-2"}, + }, + }, + }, } { t.Run(tc.desc, func(t *testing.T) { appendFn := tc.appendFn @@ -805,7 +877,6 @@ func testStoreAPIsSeriesSplitSamplesIntoChunksWithMaxSizeOf120(t *testing.T, sta extLset := labels.FromStrings("region", "eu-west") appendFn := func(app storage.Appender) { - var ( ref storage.SeriesRef err error @@ -855,7 +926,8 @@ func testStoreAPIsSeriesSplitSamplesIntoChunksWithMaxSizeOf120(t *testing.T, sta } func TestBucketStore_Acceptance(t *testing.T) { - t.Cleanup(func() { custom.TolerantVerifyLeak(t) }) + t.Parallel() + ctx := context.Background() startStore := func(lazyExpandedPostings bool) func(tt *testing.T, extLset labels.Labels, appendFn func(app storage.Appender)) storepb.StoreServer { @@ -887,7 +959,7 @@ func TestBucketStore_Acceptance(t *testing.T) { } for _, replica := range []string{"r1", "r2"} { - id := createBlockFromHead(tt, auxDir, h) + id := storetestutil.CreateBlockFromHead(tt, auxDir, h) auxBlockDir := filepath.Join(auxDir, id.String()) meta, err := metadata.ReadFromDir(auxBlockDir) @@ -950,7 +1022,7 @@ func TestBucketStore_Acceptance(t *testing.T) { } func TestPrometheusStore_Acceptance(t *testing.T) { - t.Cleanup(func() { custom.TolerantVerifyLeak(t) }) + t.Parallel() startStore := func(tt *testing.T, extLset labels.Labels, appendFn func(app storage.Appender)) storepb.StoreServer { p, err := e2eutil.NewPrometheus() @@ -983,7 +1055,7 @@ func TestPrometheusStore_Acceptance(t *testing.T) { } func TestTSDBStore_Acceptance(t *testing.T) { - t.Cleanup(func() { custom.TolerantVerifyLeak(t) }) + t.Parallel() startStore := func(tt *testing.T, extLset labels.Labels, appendFn func(app storage.Appender)) storepb.StoreServer { db, err := e2eutil.NewTSDB() @@ -999,41 +1071,143 @@ func TestTSDBStore_Acceptance(t *testing.T) { } func TestProxyStoreWithTSDBSelector_Acceptance(t *testing.T) { - t.Cleanup(func() { custom.TolerantVerifyLeak(t) }) + t.Skip("This is a known issue, we need to think how to fix it") + + ctx := context.Background() startStore := func(tt *testing.T, extLset labels.Labels, appendFn func(app storage.Appender)) storepb.StoreServer { - startNestedStore := func(tt *testing.T, extLset labels.Labels, appendFn func(app storage.Appender)) storepb.StoreServer { - db, err := e2eutil.NewTSDB() + startNestedStore := func(tt *testing.T, appendFn func(app storage.Appender), extLsets ...labels.Labels) storepb.StoreServer { + tmpDir := tt.TempDir() + bktDir := filepath.Join(tmpDir, "bkt") + auxDir := filepath.Join(tmpDir, "aux") + metaDir := filepath.Join(tmpDir, "meta") + + testutil.Ok(tt, os.MkdirAll(metaDir, os.ModePerm)) + testutil.Ok(tt, os.MkdirAll(auxDir, os.ModePerm)) + + bkt, err := filesystem.NewBucket(bktDir) testutil.Ok(tt, err) - tt.Cleanup(func() { testutil.Ok(tt, db.Close()) }) - appendFn(db.Appender(context.Background())) + tt.Cleanup(func() { testutil.Ok(tt, bkt.Close()) }) - return NewTSDBStore(nil, db, component.Rule, extLset) + headOpts := tsdb.DefaultHeadOptions() + headOpts.ChunkDirRoot = tmpDir + headOpts.ChunkRange = 1000 + h, err := tsdb.NewHead(nil, nil, nil, nil, headOpts, nil) + testutil.Ok(tt, err) + tt.Cleanup(func() { testutil.Ok(tt, h.Close()) }) + logger := log.NewNopLogger() + + appendFn(h.Appender(context.Background())) + + if h.NumSeries() == 0 { + tt.Skip("Bucket Store cannot handle empty HEAD") + } + + for _, extLset := range extLsets { + id := storetestutil.CreateBlockFromHead(tt, auxDir, h) + + auxBlockDir := filepath.Join(auxDir, id.String()) + meta, err := metadata.ReadFromDir(auxBlockDir) + testutil.Ok(t, err) + stats, err := block.GatherIndexHealthStats(ctx, logger, filepath.Join(auxBlockDir, block.IndexFilename), meta.MinTime, meta.MaxTime) + testutil.Ok(t, err) + _, err = metadata.InjectThanos(log.NewNopLogger(), auxBlockDir, metadata.Thanos{ + Labels: extLset.Map(), + Downsample: metadata.ThanosDownsample{Resolution: 0}, + Source: metadata.TestSource, + IndexStats: metadata.IndexStats{SeriesMaxSize: stats.SeriesMaxSize, ChunkMaxSize: stats.ChunkMaxSize}, + }, nil) + testutil.Ok(tt, err) + + testutil.Ok(tt, block.Upload(ctx, logger, bkt, auxBlockDir, metadata.NoneFunc)) + } + + chunkPool, err := NewDefaultChunkBytesPool(2e5) + testutil.Ok(tt, err) + + insBkt := objstore.WithNoopInstr(bkt) + baseBlockIDsFetcher := block.NewConcurrentLister(logger, insBkt) + metaFetcher, err := block.NewMetaFetcher(logger, 20, insBkt, baseBlockIDsFetcher, metaDir, nil, []block.MetadataFilter{ + block.NewTimePartitionMetaFilter(allowAllFilterConf.MinTime, allowAllFilterConf.MaxTime), + }) + testutil.Ok(tt, err) + + bucketStore, err := NewBucketStore( + objstore.WithNoopInstr(bkt), + metaFetcher, + "", + NewChunksLimiterFactory(10e6), + NewSeriesLimiterFactory(10e6), + NewBytesLimiterFactory(10e6), + NewGapBasedPartitioner(PartitionerMaxGapSize), + 20, + true, + DefaultPostingOffsetInMemorySampling, + false, + false, + 1*time.Minute, + WithChunkPool(chunkPool), + WithFilterConfig(allowAllFilterConf), + ) + testutil.Ok(tt, err) + tt.Cleanup(func() { testutil.Ok(tt, bucketStore.Close()) }) + testutil.Ok(tt, bucketStore.SyncBlocks(context.Background())) + + return bucketStore } - p1 := startNestedStore(tt, extLset, appendFn) - p2 := startNestedStore(tt, labels.FromStrings("some", "label"), appendFn) + extLset1 := labels.NewBuilder(extLset).Set("L1", "A").Set("L2", "B").Labels() + extLset2 := labels.NewBuilder(extLset).Set("L1", "C").Set("L2", "D").Labels() + extLset3 := labels.NewBuilder(extLset).Set("L1", "A").Set("L2", "D").Labels() + + p1 := startNestedStore(tt, appendFn, extLset1, extLset2, extLset3) clients := []Client{ - storetestutil.TestClient{StoreClient: storepb.ServerAsClient(p1), ExtLset: []labels.Labels{extLset}}, - storetestutil.TestClient{StoreClient: storepb.ServerAsClient(p2), ExtLset: []labels.Labels{labels.FromStrings("some", "label")}}, + storetestutil.TestClient{StoreClient: storepb.ServerAsClient(p1), ExtLset: []labels.Labels{extLset1, extLset2, extLset3}}, } relabelCfgs := []*relabel.Config{{ - SourceLabels: model.LabelNames([]model.LabelName{"some"}), - Regex: relabel.MustNewRegexp("label"), - Action: relabel.Drop, + SourceLabels: model.LabelNames([]model.LabelName{"L1", "L2"}), + Separator: "-", + Regex: relabel.MustNewRegexp("(A-B|C-D)"), + Action: relabel.Keep, }} return NewProxyStore(nil, nil, func() []Client { return clients }, component.Query, labels.EmptyLabels(), 0*time.Second, RetrievalStrategy(EagerRetrieval), WithTSDBSelector(NewTSDBSelector(relabelCfgs))) } - testStoreAPIsAcceptance(t, startStore) + client := startStore(t, labels.EmptyLabels(), func(app storage.Appender) { + _, err := app.Append(0, labels.FromStrings("a", "b"), 0, 0) + testutil.Ok(t, err) + testutil.Ok(t, app.Commit()) + }) + srv := newStoreSeriesServer(ctx) + + testutil.Ok(t, client.Series(&storepb.SeriesRequest{ + MinTime: minTime.Unix(), + MaxTime: maxTime.Unix(), + Matchers: []storepb.LabelMatcher{ + {Type: storepb.LabelMatcher_EQ, Name: "a", Value: "b"}, + }, + }, srv)) + + receivedLabels := make([]labels.Labels, 0) + for _, s := range srv.SeriesSet { + receivedLabels = append(receivedLabels, s.PromLabels()) + } + + // This fails currently because the method of using matchers cannot drop extLset3 even though we should only + // select extLset1 and extLset2 because of the TSDB Selector + testutil.Equals(t, receivedLabels, []labels.Labels{ + labels.FromStrings("L1", "A", "L2", "B", "a", "b"), + labels.FromStrings("L1", "C", "L2", "D", "a", "b"), + }) + } func TestProxyStoreWithReplicas_Acceptance(t *testing.T) { - t.Cleanup(func() { custom.TolerantVerifyLeak(t) }) + t.Parallel() startStore := func(tt *testing.T, extLset labels.Labels, appendFn func(app storage.Appender)) storepb.StoreServer { startNestedStore := func(tt *testing.T, extLset labels.Labels, appendFn func(app storage.Appender)) storepb.StoreServer { diff --git a/pkg/store/bucket.go b/pkg/store/bucket.go index d5e90a209a..15801b6650 100644 --- a/pkg/store/bucket.go +++ b/pkg/store/bucket.go @@ -46,7 +46,6 @@ import ( "github.com/thanos-io/thanos/pkg/block/indexheader" "github.com/thanos-io/thanos/pkg/block/metadata" "github.com/thanos-io/thanos/pkg/compact/downsample" - "github.com/thanos-io/thanos/pkg/component" "github.com/thanos-io/thanos/pkg/extprom" "github.com/thanos-io/thanos/pkg/gate" "github.com/thanos-io/thanos/pkg/info/infopb" @@ -62,6 +61,17 @@ import ( "github.com/thanos-io/thanos/pkg/tracing" ) +type StoreDataType int + +const ( + PostingsFetched StoreDataType = iota + PostingsTouched + SeriesFetched + SeriesTouched + ChunksFetched + ChunksTouched +) + const ( // MaxSamplesPerChunk is approximately the max number of samples that we may have in any given chunk. This is needed // for precalculating the number of samples that we may have to retrieve and decode for any given query @@ -106,6 +116,9 @@ const ( // SeriesBatchSize is the default batch size when fetching series from object storage. SeriesBatchSize = 10000 + + // checkContextEveryNIterations is used in some tight loops to check if the context is done. + checkContextEveryNIterations = 128 ) var ( @@ -367,7 +380,7 @@ type BucketStore struct { indexCache storecache.IndexCache indexReaderPool *indexheader.ReaderPool buffers sync.Pool - chunkPool pool.Bytes + chunkPool pool.Pool[byte] seriesBatchSize int // Sets of blocks that have the same labels. They are indexed by a hash over their label set. @@ -388,10 +401,10 @@ type BucketStore struct { // seriesLimiterFactory creates a new limiter used to limit the number of touched series by each Series() call, // or LabelName and LabelValues calls when used with matchers. seriesLimiterFactory SeriesLimiterFactory - // bytesLimiterFactory creates a new limiter used to limit the amount of bytes fetched/touched by each Series() call. bytesLimiterFactory BytesLimiterFactory - partitioner Partitioner + + partitioner Partitioner filterConfig *FilterConfig advLabelSets []labelpb.ZLabelSet @@ -413,6 +426,8 @@ type BucketStore struct { blockEstimatedMaxChunkFunc BlockEstimator indexHeaderLazyDownloadStrategy indexheader.LazyDownloadIndexHeaderFunc + + requestLoggerFunc RequestLoggerFunc } func (s *BucketStore) validate() error { @@ -449,6 +464,20 @@ func WithLogger(logger log.Logger) BucketStoreOption { } } +type RequestLoggerFunc func(ctx context.Context, log log.Logger) log.Logger + +func NoopRequestLoggerFunc(_ context.Context, logger log.Logger) log.Logger { + return logger +} + +// WithRequestLoggerFunc sets the BucketStore to use the passed RequestLoggerFunc +// to initialize logger during query time. +func WithRequestLoggerFunc(loggerFunc RequestLoggerFunc) BucketStoreOption { + return func(s *BucketStore) { + s.requestLoggerFunc = loggerFunc + } +} + // WithRegistry sets a registry that BucketStore uses to register metrics with. func WithRegistry(reg prometheus.Registerer) BucketStoreOption { return func(s *BucketStore) { @@ -471,7 +500,7 @@ func WithQueryGate(queryGate gate.Gate) BucketStoreOption { } // WithChunkPool sets a pool.Bytes to use for chunks. -func WithChunkPool(chunkPool pool.Bytes) BucketStoreOption { +func WithChunkPool(chunkPool pool.Pool[byte]) BucketStoreOption { return func(s *BucketStore) { s.chunkPool = chunkPool } @@ -567,7 +596,7 @@ func NewBucketStore( b := make([]byte, 0, initialBufSize) return &b }}, - chunkPool: pool.NoopBytes{}, + chunkPool: pool.NoopPool[byte]{}, blocks: map[ulid.ULID]*bucketBlock{}, blockSets: map[uint64]*bucketBlockSet{}, blockSyncConcurrency: blockSyncConcurrency, @@ -583,6 +612,7 @@ func NewBucketStore( seriesBatchSize: SeriesBatchSize, sortingStrategy: sortingStrategyStore, indexHeaderLazyDownloadStrategy: indexheader.AlwaysEagerDownloadIndexHeader, + requestLoggerFunc: NoopRequestLoggerFunc, } for _, option := range options { @@ -779,7 +809,6 @@ func (s *BucketStore) addBlock(ctx context.Context, meta *metadata.Meta) (err er b, err := newBucketBlock( ctx, - log.With(s.logger, "block", meta.ULID), s.metrics, meta, s.bkt, @@ -892,17 +921,15 @@ func (s *BucketStore) TSDBInfos() []infopb.TSDBInfo { sort.Slice(infos, func(i, j int) bool { return infos[i].MinTime < infos[j].MinTime }) cur := infos[0] - for i, info := range infos { + for _, info := range infos { if info.MinTime > cur.MaxTime { res = append(res, cur) cur = info continue } cur.MaxTime = info.MaxTime - if i == len(infos)-1 { - res = append(res, cur) - } } + res = append(res, cur) } return res @@ -920,19 +947,6 @@ func (s *BucketStore) LabelSet() []labelpb.ZLabelSet { return labelSets } -// Info implements the storepb.StoreServer interface. -func (s *BucketStore) Info(context.Context, *storepb.InfoRequest) (*storepb.InfoResponse, error) { - mint, maxt := s.TimeRange() - res := &storepb.InfoResponse{ - StoreType: component.Store.ToProto(), - MinTime: mint, - MaxTime: maxt, - LabelSets: s.LabelSet(), - } - - return res, nil -} - func (s *BucketStore) limitMinTime(mint int64) int64 { if s.filterConfig == nil { return mint @@ -978,6 +992,7 @@ type blockSeriesClient struct { mint int64 maxt int64 + seriesLimit int indexr *bucketIndexReader chunkr *bucketChunkReader loadAggregates []storepb.Aggr @@ -1037,7 +1052,12 @@ func newBlockSeriesClient( ) *blockSeriesClient { var chunkr *bucketChunkReader if !req.SkipChunks { - chunkr = b.chunkReader() + chunkr = b.chunkReader(logger) + } + + extLset := b.extLset + if extLsetToRemove != nil { + extLset = rmLabels(extLset.Copy(), extLsetToRemove) } extLset := b.extLset @@ -1053,7 +1073,8 @@ func newBlockSeriesClient( mint: req.MinTime, maxt: req.MaxTime, - indexr: b.indexReader(), + seriesLimit: int(req.Limit), + indexr: b.indexReader(logger), chunkr: chunkr, seriesLimiter: seriesLimiter, chunksLimiter: chunksLimiter, @@ -1132,14 +1153,20 @@ func (b *blockSeriesClient) ExpandPostings( b.expandedPostings = make([]storage.SeriesRef, 0, len(b.lazyPostings.postings)/2) b.lazyExpandedPostingsCount.Inc() } else { + // If seriesLimit is set, it can be applied here to limit the amount of series. + // Note: This can only be done when postings are not expanded lazily. + if b.seriesLimit > 0 && len(b.lazyPostings.postings) > b.seriesLimit { + b.lazyPostings.postings = b.lazyPostings.postings[:b.seriesLimit] + } + // Apply series limiter eargerly if lazy postings not enabled. - if err := seriesLimiter.Reserve(uint64(len(ps.postings))); err != nil { + if err := seriesLimiter.Reserve(uint64(len(b.lazyPostings.postings))); err != nil { return httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded series limit: %s", err) } } - if b.batchSize > len(ps.postings) { - b.batchSize = len(ps.postings) + if b.batchSize > len(b.lazyPostings.postings) { + b.batchSize = len(b.lazyPostings.postings) } b.entries = make([]seriesEntry, 0, b.batchSize) @@ -1261,6 +1288,11 @@ OUTER: } seriesMatched++ + if b.seriesLimit > 0 && seriesMatched > b.seriesLimit { + // Exit early if seriesLimit is set. + b.hasMorePostings = false + break + } s := seriesEntry{lset: completeLabelset} if b.skipChunks { b.entries = append(b.entries, s) @@ -1469,6 +1501,8 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store seriesLimiter = s.seriesLimiterFactory(s.metrics.queriesDropped.WithLabelValues("series", tenant)) queryStatsEnabled = false + + logger = s.requestLoggerFunc(ctx, s.logger) ) if req.Hints != nil { @@ -1505,7 +1539,7 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store blocks := bs.getFor(req.MinTime, req.MaxTime, req.MaxResolutionWindow, reqBlockMatchers) if s.debugLogging { - debugFoundBlockSetOverview(s.logger, req.MinTime, req.MaxTime, req.MaxResolutionWindow, bs.labels, blocks) + debugFoundBlockSetOverview(logger, req.MinTime, req.MaxTime, req.MaxResolutionWindow, bs.labels, blocks) } for _, b := range blocks { @@ -1521,7 +1555,7 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store blockClient := newBlockSeriesClient( srv.Context(), - s.logger, + log.With(logger, "block", blk.meta.ULID), blk, req, seriesLimiter, @@ -1631,10 +1665,12 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store s.metrics.cachedPostingsCompressedSizeBytes.WithLabelValues(tenant).Add(float64(stats.CachedPostingsCompressedSizeSum)) s.metrics.postingsSizeBytes.WithLabelValues(tenant).Observe(float64(int(stats.PostingsFetchedSizeSum) + int(stats.PostingsTouchedSizeSum))) - level.Debug(s.logger).Log("msg", "stats query processed", - "request", req, - "tenant", tenant, - "stats", fmt.Sprintf("%+v", stats), "err", err) + if s.debugLogging { + level.Debug(logger).Log("msg", "stats query processed", + "request", req, + "tenant", tenant, + "stats", fmt.Sprintf("%+v", stats), "err", err) + } }() // Concurrently get data from all blocks. @@ -1656,11 +1692,18 @@ func (s *BucketStore) Series(req *storepb.SeriesRequest, seriesSrv storepb.Store s.metrics.seriesBlocksQueried.WithLabelValues(tenant).Observe(float64(stats.blocksQueried)) } + lt := NewProxyResponseLoserTree(respSets...) + defer lt.Close() // Merge the sub-results from each selected block. tracing.DoInSpan(ctx, "bucket_store_merge_all", func(ctx context.Context) { begin := time.Now() - set := NewResponseDeduplicator(NewProxyResponseLoserTree(respSets...)) + set := NewResponseDeduplicator(lt) + i := 0 for set.Next() { + i++ + if req.Limit > 0 && i > int(req.Limit) { + break + } at := set.At() warn := at.GetWarning() if warn != "" { @@ -1762,6 +1805,7 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq var sets [][]string var seriesLimiter = s.seriesLimiterFactory(s.metrics.queriesDropped.WithLabelValues("series", tenant)) var bytesLimiter = s.bytesLimiterFactory(s.metrics.queriesDropped.WithLabelValues("bytes", tenant)) + var logger = s.requestLoggerFunc(ctx, s.logger) for _, b := range s.blocks { b := b @@ -1783,7 +1827,8 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq resHints.AddQueriedBlock(b.meta.ULID) - indexr := b.indexReader() + blockLogger := log.With(logger, "block", b.meta.ULID) + indexr := b.indexReader(blockLogger) g.Go(func() error { span, newCtx := tracing.StartSpan(gctx, "bucket_store_block_label_names", tracing.Tags{ @@ -1793,7 +1838,7 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq "block.resolution": b.meta.Thanos.Downsample.Resolution, }) defer span.Finish() - defer runutil.CloseWithLogOnErr(s.logger, indexr, "label names") + defer runutil.CloseWithLogOnErr(blockLogger, indexr, "label names") var result []string if len(reqSeriesMatchersNoExtLabels) == 0 { @@ -1814,7 +1859,7 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq } }) - result = strutil.MergeSlices(res, extRes) + result = strutil.MergeSlices(int(req.Limit), res, extRes) } else { seriesReq := &storepb.SeriesRequest{ MinTime: req.Start, @@ -1824,7 +1869,7 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq } blockClient := newBlockSeriesClient( newCtx, - s.logger, + blockLogger, b, seriesReq, seriesLimiter, @@ -1909,8 +1954,10 @@ func (s *BucketStore) LabelNames(ctx context.Context, req *storepb.LabelNamesReq return nil, status.Error(codes.Unknown, errors.Wrap(err, "marshal label names response hints").Error()) } + names := strutil.MergeSlices(int(req.Limit), sets...) + return &storepb.LabelNamesResponse{ - Names: strutil.MergeSlices(sets...), + Names: names, Hints: anyHints, }, nil } @@ -1924,7 +1971,7 @@ func (b *bucketBlock) FilterExtLabelsMatchers(matchers []*labels.Matcher) ([]*la // If value is empty string the matcher is a valid one since it's not part of external labels. if v == "" { result = append(result, m) - } else if v != "" && v != m.Value { + } else if v != "" && !m.Matches(v) { // If matcher is external label but value is different we don't want to look in block anyway. return []*labels.Matcher{}, false } @@ -1949,6 +1996,14 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR resHints := &hintspb.LabelValuesResponseHints{} + var hasMetricNameEqMatcher = false + for _, m := range reqSeriesMatchers { + if m.Name == labels.MetricName && m.Type == labels.MatchEqual { + hasMetricNameEqMatcher = true + break + } + } + g, gctx := errgroup.WithContext(ctx) var reqBlockMatchers []*labels.Matcher @@ -1971,6 +2026,8 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR var sets [][]string var seriesLimiter = s.seriesLimiterFactory(s.metrics.queriesDropped.WithLabelValues("series", tenant)) var bytesLimiter = s.bytesLimiterFactory(s.metrics.queriesDropped.WithLabelValues("bytes", tenant)) + var logger = s.requestLoggerFunc(ctx, s.logger) + var stats = &queryStats{} for _, b := range s.blocks { b := b @@ -1989,7 +2046,8 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR // If we have series matchers and the Label is not an external one, add != "" matcher // to only select series that have given label name. - if len(reqSeriesMatchersNoExtLabels) > 0 && !b.extLset.Has(req.Label) { + // We don't need such matcher if matchers already contain __name__=="something" matcher. + if !hasMetricNameEqMatcher && len(reqSeriesMatchersNoExtLabels) > 0 && !b.extLset.Has(req.Label) { m, err := labels.NewMatcher(labels.MatchNotEqual, req.Label, "") if err != nil { return nil, status.Error(codes.InvalidArgument, err.Error()) @@ -2002,7 +2060,9 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR resHints.AddQueriedBlock(b.meta.ULID) - indexr := b.indexReader() + blockLogger := log.With(logger, "block", b.meta.ULID) + indexr := b.indexReader(blockLogger) + g.Go(func() error { span, newCtx := tracing.StartSpan(gctx, "bucket_store_block_label_values", tracing.Tags{ "block.id": b.meta.ULID, @@ -2011,7 +2071,7 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR "block.resolution": b.meta.Thanos.Downsample.Resolution, }) defer span.Finish() - defer runutil.CloseWithLogOnErr(s.logger, indexr, "label values") + defer runutil.CloseWithLogOnErr(blockLogger, indexr, "label values") var result []string if len(reqSeriesMatchersNoExtLabels) == 0 { @@ -2023,7 +2083,7 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR // Add the external label value as well. if extLabelValue := b.extLset.Get(req.Label); extLabelValue != "" { - res = strutil.MergeSlices(res, []string{extLabelValue}) + res = strutil.MergeSlices(int(req.Limit), res, []string{extLabelValue}) } result = res } else { @@ -2035,7 +2095,7 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR } blockClient := newBlockSeriesClient( newCtx, - s.logger, + blockLogger, b, seriesReq, seriesLimiter, @@ -2055,7 +2115,12 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR s.metrics.lazyExpandedPostingSeriesOverfetchedSizeBytes, tenant, ) - defer blockClient.Close() + defer func() { + mtx.Lock() + stats = blockClient.MergeStats(stats) + mtx.Unlock() + blockClient.Close() + }() if err := blockClient.ExpandPostings( sortedReqSeriesMatchersNoExtLabels, @@ -2084,7 +2149,7 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR } val := labelpb.ZLabelsToPromLabels(ls.GetSeries().Labels).Get(req.Label) - if val != "" { // Should never be empty since we added labelName!="" matcher to the list of matchers. + if val != "" { values[val] = struct{}{} } } @@ -2108,6 +2173,15 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR s.mtx.RUnlock() + defer func() { + if s.debugLogging { + level.Debug(logger).Log("msg", "stats query processed", + "request", req, + "tenant", tenant, + "stats", fmt.Sprintf("%+v", stats), "err", err) + } + }() + if err := g.Wait(); err != nil { code := codes.Internal if s, ok := status.FromError(errors.Cause(err)); ok { @@ -2121,8 +2195,10 @@ func (s *BucketStore) LabelValues(ctx context.Context, req *storepb.LabelValuesR return nil, status.Error(codes.Unknown, errors.Wrap(err, "marshal label values response hints").Error()) } + vals := strutil.MergeSlices(int(req.Limit), sets...) + return &storepb.LabelValuesResponse{ - Values: strutil.MergeSlices(sets...), + Values: vals, Hints: anyHints, }, nil } @@ -2265,13 +2341,12 @@ func (s *bucketBlockSet) labelMatchers(matchers ...*labels.Matcher) ([]*labels.M // bucketBlock represents a block that is located in a bucket. It holds intermediate // state for the block on local disk. type bucketBlock struct { - logger log.Logger metrics *bucketStoreMetrics bkt objstore.BucketReader meta *metadata.Meta dir string indexCache storecache.IndexCache - chunkPool pool.Bytes + chunkPool pool.Pool[byte] extLset labels.Labels indexHeaderReader indexheader.Reader @@ -2292,13 +2367,12 @@ type bucketBlock struct { func newBucketBlock( ctx context.Context, - logger log.Logger, metrics *bucketStoreMetrics, meta *metadata.Meta, bkt objstore.BucketReader, dir string, indexCache storecache.IndexCache, - chunkPool pool.Bytes, + chunkPool pool.Pool[byte], indexHeadReader indexheader.Reader, p Partitioner, maxSeriesSizeFunc BlockEstimator, @@ -2317,7 +2391,6 @@ func newBucketBlock( extLset := labels.FromMap(meta.Thanos.Labels) relabelLabels := labels.NewBuilder(extLset).Set(block.BlockIDLabel, meta.ULID.String()).Labels() b = &bucketBlock{ - logger: logger, metrics: metrics, bkt: bkt, indexCache: indexCache, @@ -2356,12 +2429,12 @@ func (b *bucketBlock) indexFilename() string { return path.Join(b.meta.ULID.String(), block.IndexFilename) } -func (b *bucketBlock) readIndexRange(ctx context.Context, off, length int64) ([]byte, error) { +func (b *bucketBlock) readIndexRange(ctx context.Context, off, length int64, logger log.Logger) ([]byte, error) { r, err := b.bkt.GetRange(ctx, b.indexFilename(), off, length) if err != nil { return nil, errors.Wrap(err, "get range reader") } - defer runutil.CloseWithLogOnErr(b.logger, r, "readIndexRange close range reader") + defer runutil.CloseWithLogOnErr(logger, r, "readIndexRange close range reader") // Preallocate the buffer with the exact size so we don't waste allocations // while progressively growing an initial small buffer. The buffer capacity @@ -2374,7 +2447,7 @@ func (b *bucketBlock) readIndexRange(ctx context.Context, off, length int64) ([] return buf.Bytes(), nil } -func (b *bucketBlock) readChunkRange(ctx context.Context, seq int, off, length int64, chunkRanges byteRanges) (*[]byte, error) { +func (b *bucketBlock) readChunkRange(ctx context.Context, seq int, off, length int64, chunkRanges byteRanges, logger log.Logger) (*[]byte, error) { if seq < 0 || seq >= len(b.chunkObjs) { return nil, errors.Errorf("unknown segment file for index %d", seq) } @@ -2384,7 +2457,7 @@ func (b *bucketBlock) readChunkRange(ctx context.Context, seq int, off, length i if err != nil { return nil, errors.Wrap(err, "get range reader") } - defer runutil.CloseWithLogOnErr(b.logger, reader, "readChunkRange close range reader") + defer runutil.CloseWithLogOnErr(logger, reader, "readChunkRange close range reader") // Get a buffer from the pool. chunkBuffer, err := b.chunkPool.Get(chunkRanges.size()) @@ -2408,14 +2481,14 @@ func (b *bucketBlock) chunkRangeReader(ctx context.Context, seq int, off, length return b.bkt.GetRange(ctx, b.chunkObjs[seq], off, length) } -func (b *bucketBlock) indexReader() *bucketIndexReader { +func (b *bucketBlock) indexReader(logger log.Logger) *bucketIndexReader { b.pendingReaders.Add(1) - return newBucketIndexReader(b) + return newBucketIndexReader(b, logger) } -func (b *bucketBlock) chunkReader() *bucketChunkReader { +func (b *bucketBlock) chunkReader(logger log.Logger) *bucketChunkReader { b.pendingReaders.Add(1) - return newBucketChunkReader(b) + return newBucketChunkReader(b, logger) } // matchRelabelLabels verifies whether the block matches the given matchers. @@ -2452,9 +2525,10 @@ type bucketIndexReader struct { loadedSeries map[storage.SeriesRef][]byte indexVersion int + logger log.Logger } -func newBucketIndexReader(block *bucketBlock) *bucketIndexReader { +func newBucketIndexReader(block *bucketBlock, logger log.Logger) *bucketIndexReader { r := &bucketIndexReader{ block: block, dec: &index.Decoder{ @@ -2462,6 +2536,7 @@ func newBucketIndexReader(block *bucketBlock) *bucketIndexReader { }, stats: &queryStats{}, loadedSeries: map[storage.SeriesRef][]byte{}, + logger: logger, } return r } @@ -2570,10 +2645,15 @@ func (r *bucketIndexReader) ExpandedPostings(ctx context.Context, ms sortedMatch } // ExpandPostingsWithContext returns the postings expanded as a slice and considers context. -func ExpandPostingsWithContext(ctx context.Context, p index.Postings) (res []storage.SeriesRef, err error) { +func ExpandPostingsWithContext(ctx context.Context, p index.Postings) ([]storage.SeriesRef, error) { + res := make([]storage.SeriesRef, 0, 1024) // Pre-allocate slice with initial capacity + i := 0 for p.Next() { - if ctx.Err() != nil { - return nil, ctx.Err() + i++ + if i%checkContextEveryNIterations == 0 { + if err := ctx.Err(); err != nil { + return nil, err + } } res = append(res, p.At()) } @@ -2796,8 +2876,8 @@ func toPostingGroup(ctx context.Context, lvalsFn func(name string) ([]string, er return nil, nil, err } - for _, val := range vals { - if ctx.Err() != nil { + for i, val := range vals { + if (i+1)%checkContextEveryNIterations == 0 && ctx.Err() != nil { return nil, nil, ctx.Err() } if !m.Matches(val) { @@ -2825,8 +2905,8 @@ func toPostingGroup(ctx context.Context, lvalsFn func(name string) ([]string, er } var toAdd []string - for _, val := range vals { - if ctx.Err() != nil { + for i, val := range vals { + if (i+1)%checkContextEveryNIterations == 0 && ctx.Err() != nil { return nil, nil, ctx.Err() } if m.Matches(val) { @@ -2847,12 +2927,11 @@ func (r *bucketIndexReader) fetchExpandedPostingsFromCache(ctx context.Context, if !hit { return false, nil, nil } - if err := bytesLimiter.Reserve(uint64(len(dataFromCache))); err != nil { + if err := bytesLimiter.ReserveWithType(uint64(len(dataFromCache)), PostingsTouched); err != nil { return false, nil, httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded bytes limit while loading expanded postings from index cache: %s", err) } - r.stats.DataDownloadedSizeSum += units.Base2Bytes(len(dataFromCache)) - r.stats.postingsTouched++ - r.stats.PostingsTouchedSizeSum += units.Base2Bytes(len(dataFromCache)) + + r.stats.add(PostingsTouched, 1, len(dataFromCache)) p, closeFns, err := r.decodeCachedPostings(dataFromCache) defer func() { for _, closeFn := range closeFns { @@ -2861,13 +2940,13 @@ func (r *bucketIndexReader) fetchExpandedPostingsFromCache(ctx context.Context, }() // If failed to decode or expand cached postings, return and expand postings again. if err != nil { - level.Error(r.block.logger).Log("msg", "failed to decode cached expanded postings, refetch postings", "id", r.block.meta.ULID.String(), "err", err) + level.Error(r.logger).Log("msg", "failed to decode cached expanded postings, refetch postings", "id", r.block.meta.ULID.String(), "err", err) return false, nil, nil } ps, err := ExpandPostingsWithContext(ctx, p) if err != nil { - level.Error(r.block.logger).Log("msg", "failed to expand cached expanded postings, refetch postings", "id", r.block.meta.ULID.String(), "err", err) + level.Error(r.logger).Log("msg", "failed to expand cached expanded postings, refetch postings", "id", r.block.meta.ULID.String(), "err", err) return false, nil, nil } @@ -2921,7 +3000,7 @@ func (r *bucketIndexReader) fetchPostings(ctx context.Context, keys []labels.Lab // Fetch postings from the cache with a single call. fromCache, _ := r.block.indexCache.FetchMultiPostings(ctx, r.block.meta.ULID, keys, tenant) for _, dataFromCache := range fromCache { - if err := bytesLimiter.Reserve(uint64(len(dataFromCache))); err != nil { + if err := bytesLimiter.ReserveWithType(uint64(len(dataFromCache)), PostingsTouched); err != nil { return nil, closeFns, httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded bytes limit while loading postings from index cache: %s", err) } r.stats.DataDownloadedSizeSum += units.Base2Bytes(len(dataFromCache)) @@ -2931,13 +3010,14 @@ func (r *bucketIndexReader) fetchPostings(ctx context.Context, keys []labels.Lab // If we have a miss, mark key to be fetched in `ptrs` slice. // Overlaps are well handled by partitioner, so we don't need to deduplicate keys. for ix, key := range keys { - if err := ctx.Err(); err != nil { - return nil, closeFns, err + if (ix+1)%checkContextEveryNIterations == 0 { + if err := ctx.Err(); err != nil { + return nil, closeFns, err + } } // Get postings for the given key from cache first. if b, ok := fromCache[key]; ok { - r.stats.postingsTouched++ - r.stats.PostingsTouchedSizeSum += units.Base2Bytes(len(b)) + r.stats.add(PostingsTouched, 1, len(b)) l, closer, err := r.decodeCachedPostings(b) if err != nil { @@ -2978,7 +3058,7 @@ func (r *bucketIndexReader) fetchPostings(ctx context.Context, keys []labels.Lab start := int64(part.Start) length := int64(part.End) - start - if err := bytesLimiter.Reserve(uint64(length)); err != nil { + if err := bytesLimiter.ReserveWithType(uint64(length), PostingsFetched); err != nil { return nil, closeFns, httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded bytes limit while fetching postings: %s", err) } r.stats.DataDownloadedSizeSum += units.Base2Bytes(length) @@ -3007,14 +3087,13 @@ func (r *bucketIndexReader) fetchPostings(ctx context.Context, keys []labels.Lab if err != nil { return errors.Wrap(err, "read postings range") } - defer runutil.CloseWithLogOnErr(r.block.logger, partReader, "readIndexRange close range reader") + defer runutil.CloseWithLogOnErr(r.logger, partReader, "readIndexRange close range reader") brdr.Reset(partReader) rdr := newPostingsReaderBuilder(ctx, brdr, ptrs[i:j], start, length) stats.postingsFetchCount++ - stats.postingsFetched += j - i - stats.PostingsFetchedSizeSum += units.Base2Bytes(int(length)) + stats.add(PostingsFetched, j-i, int(length)) for rdr.Next() { diffVarintPostings, postingsCount, keyID := rdr.AtDiffVarint() @@ -3028,12 +3107,11 @@ func (r *bucketIndexReader) fetchPostings(ctx context.Context, keys []labels.Lab return errors.Wrap(err, "encoding with snappy") } - stats.postingsTouched++ - stats.PostingsTouchedSizeSum += units.Base2Bytes(int(len(diffVarintPostings))) stats.cachedPostingsCompressions += 1 stats.CachedPostingsOriginalSizeSum += units.Base2Bytes(len(diffVarintPostings)) stats.CachedPostingsCompressedSizeSum += units.Base2Bytes(len(dataToCache)) stats.CachedPostingsCompressionTimeSum += time.Since(startCompression) + stats.add(PostingsTouched, 1, len(diffVarintPostings)) r.block.indexCache.StorePostings(r.block.meta.ULID, keys[keyID], dataToCache, tenant) } @@ -3156,7 +3234,7 @@ func (r *bucketIndexReader) PreloadSeries(ctx context.Context, ids []storage.Ser fromCache, ids := r.block.indexCache.FetchMultiSeries(ctx, r.block.meta.ULID, ids, tenant) for id, b := range fromCache { r.loadedSeries[id] = b - if err := bytesLimiter.Reserve(uint64(len(b))); err != nil { + if err := bytesLimiter.ReserveWithType(uint64(len(b)), SeriesTouched); err != nil { return httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded bytes limit while loading series from index cache: %s", err) } r.stats.DataDownloadedSizeSum += units.Base2Bytes(len(b)) @@ -3185,22 +3263,18 @@ func (r *bucketIndexReader) loadSeries(ctx context.Context, ids []storage.Series r.stats.merge(stats) }() - if bytesLimiter != nil { - if err := bytesLimiter.Reserve(uint64(end - start)); err != nil { - return httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded bytes limit while fetching series: %s", err) - } - stats.DataDownloadedSizeSum += units.Base2Bytes(end - start) + if err := bytesLimiter.ReserveWithType(uint64(end-start), SeriesFetched); err != nil { + return httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded bytes limit while fetching series: %s", err) } - b, err := r.block.readIndexRange(ctx, int64(start), int64(end-start)) + b, err := r.block.readIndexRange(ctx, int64(start), int64(end-start), r.logger) if err != nil { return errors.Wrap(err, "read series range") } stats.seriesFetchCount++ - stats.seriesFetched += len(ids) stats.SeriesFetchDurationSum += time.Since(begin) - stats.SeriesFetchedSizeSum += units.Base2Bytes(int(end - start)) + stats.add(SeriesFetched, len(ids), int(end-start)) for i, id := range ids { c := b[uint64(id)-start:] @@ -3216,7 +3290,7 @@ func (r *bucketIndexReader) loadSeries(ctx context.Context, ids []storage.Series // Inefficient, but should be rare. r.block.metrics.seriesRefetches.WithLabelValues(tenant).Inc() - level.Warn(r.block.logger).Log("msg", "series size exceeded expected size; refetching", "id", id, "series length", n+int(l), "maxSeriesSize", r.block.estimatedMaxSeriesSize) + level.Warn(r.logger).Log("msg", "series size exceeded expected size; refetching", "id", id, "series length", n+int(l), "maxSeriesSize", r.block.estimatedMaxSeriesSize) // Fetch plus to get the size of next one if exists. return r.loadSeries(ctx, ids[i:], true, uint64(id), uint64(id)+uint64(n+int(l)+1), bytesLimiter, tenant) @@ -3303,8 +3377,7 @@ func (r *bucketIndexReader) LoadSeriesForTime(ref storage.SeriesRef, lset *[]sym return false, errors.Errorf("series %d not found", ref) } - r.stats.seriesTouched++ - r.stats.SeriesTouchedSizeSum += units.Base2Bytes(len(b)) + r.stats.add(SeriesTouched, 1, len(b)) return decodeSeriesForTime(b, lset, chks, skipChunks, mint, maxt) } @@ -3314,6 +3387,10 @@ func (r *bucketIndexReader) Close() error { return nil } +func (b *blockSeriesClient) CloseSend() error { + return nil +} + // LookupLabelsSymbols allows populates label set strings from symbolized label set. func (r *bucketIndexReader) LookupLabelsSymbols(ctx context.Context, symbolized []symbolizedLabel, b *labels.Builder) error { b.Reset(labels.EmptyLabels()) @@ -3406,17 +3483,19 @@ type bucketChunkReader struct { chunkBytesMtx sync.Mutex stats *queryStats chunkBytes []*[]byte // Byte slice to return to the chunk pool on close. + logger log.Logger loadingChunksMtx sync.Mutex loadingChunks bool finishLoadingChks chan struct{} } -func newBucketChunkReader(block *bucketBlock) *bucketChunkReader { +func newBucketChunkReader(block *bucketBlock, logger log.Logger) *bucketChunkReader { return &bucketChunkReader{ block: block, stats: &queryStats{}, toLoad: make([][]loadIdx, len(block.chunkObjs)), + logger: logger, } } @@ -3490,7 +3569,7 @@ func (r *bucketChunkReader) load(ctx context.Context, res []seriesEntry, aggrs [ }) for _, p := range parts { - if err := bytesLimiter.Reserve(uint64(p.End - p.Start)); err != nil { + if err := bytesLimiter.ReserveWithType(uint64(p.End-p.Start), ChunksFetched); err != nil { return httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded bytes limit while fetching chunks: %s", err) } r.stats.DataDownloadedSizeSum += units.Base2Bytes(p.End - p.Start) @@ -3523,12 +3602,11 @@ func (r *bucketChunkReader) loadChunks(ctx context.Context, res []seriesEntry, a if err != nil { return errors.Wrap(err, "get range reader") } - defer runutil.CloseWithLogOnErr(r.block.logger, reader, "readChunkRange close range reader") + defer runutil.CloseWithLogOnErr(r.logger, reader, "readChunkRange close range reader") bufReader := bufio.NewReaderSize(reader, r.block.estimatedMaxChunkSize) stats.chunksFetchCount++ - stats.chunksFetched += len(pIdxs) - stats.ChunksFetchedSizeSum += units.Base2Bytes(int(part.End - part.Start)) + stats.add(ChunksFetched, len(pIdxs), int(part.End-part.Start)) var ( buf []byte @@ -3544,10 +3622,10 @@ func (r *bucketChunkReader) loadChunks(ctx context.Context, res []seriesEntry, a bufPooled, err := r.block.chunkPool.Get(r.block.estimatedMaxChunkSize) if err == nil { buf = *bufPooled + defer r.block.chunkPool.Put(&buf) } else { buf = make([]byte, r.block.estimatedMaxChunkSize) } - defer r.block.chunkPool.Put(&buf) for i, pIdx := range pIdxs { // Fast forward range reader to the next chunk start in case of sparse (for our purposes) byte range. @@ -3584,12 +3662,12 @@ func (r *bucketChunkReader) loadChunks(ctx context.Context, res []seriesEntry, a // There is also crc32 after the chunk, but we ignore that. chunkLen = n + 1 + int(chunkDataLen) if chunkLen <= len(cb) { - err = populateChunk(&(res[pIdx.seriesEntry].chks[pIdx.chunk]), rawChunk(cb[n:chunkLen]), aggrs, r.save, calculateChunkChecksum) + c := rawChunk(cb[n:chunkLen]) + err = populateChunk(&(res[pIdx.seriesEntry].chks[pIdx.chunk]), &c, aggrs, r.save, calculateChunkChecksum) if err != nil { return errors.Wrap(err, "populate chunk") } - stats.chunksTouched++ - stats.ChunksTouchedSizeSum += units.Base2Bytes(int(chunkDataLen)) + stats.add(ChunksTouched, 1, int(chunkDataLen)) continue } @@ -3598,12 +3676,11 @@ func (r *bucketChunkReader) loadChunks(ctx context.Context, res []seriesEntry, a fetchBegin = time.Now() // Read entire chunk into new buffer. // TODO: readChunkRange call could be avoided for any chunk but last in this particular part. - if err := bytesLimiter.Reserve(uint64(chunkLen)); err != nil { + if err := bytesLimiter.ReserveWithType(uint64(chunkLen), ChunksTouched); err != nil { return httpgrpc.Errorf(int(codes.ResourceExhausted), "exceeded bytes limit while fetching chunks: %s", err) } - stats.DataDownloadedSizeSum += units.Base2Bytes(chunkLen) - nb, err := r.block.readChunkRange(ctx, seq, int64(pIdx.offset), int64(chunkLen), []byteRange{{offset: 0, length: chunkLen}}) + nb, err := r.block.readChunkRange(ctx, seq, int64(pIdx.offset), int64(chunkLen), []byteRange{{offset: 0, length: chunkLen}}, r.logger) if err != nil { return errors.Wrapf(err, "preloaded chunk too small, expecting %d, and failed to fetch full chunk", chunkLen) } @@ -3611,15 +3688,15 @@ func (r *bucketChunkReader) loadChunks(ctx context.Context, res []seriesEntry, a return errors.Errorf("preloaded chunk too small, expecting %d", chunkLen) } - stats.chunksFetchCount++ - stats.ChunksFetchedSizeSum += units.Base2Bytes(len(*nb)) - err = populateChunk(&(res[pIdx.seriesEntry].chks[pIdx.chunk]), rawChunk((*nb)[n:]), aggrs, r.save, calculateChunkChecksum) + stats.add(ChunksFetched, 1, len(*nb)) + c := rawChunk((*nb)[n:]) + err = populateChunk(&(res[pIdx.seriesEntry].chks[pIdx.chunk]), &c, aggrs, r.save, calculateChunkChecksum) if err != nil { r.block.chunkPool.Put(nb) return errors.Wrap(err, "populate chunk") } - stats.chunksTouched++ - stats.ChunksTouchedSizeSum += units.Base2Bytes(int(chunkDataLen)) + + stats.add(ChunksTouched, 1, int(chunkDataLen)) r.block.chunkPool.Put(nb) } @@ -3650,24 +3727,28 @@ func (r *bucketChunkReader) save(b []byte) ([]byte, error) { // It is used to Store API responses which don't need to introspect and validate the chunk's contents. type rawChunk []byte -func (b rawChunk) Encoding() chunkenc.Encoding { - return chunkenc.Encoding(b[0]) +func (b *rawChunk) Reset(stream []byte) { + (*b) = stream } -func (b rawChunk) Bytes() []byte { - return b[1:] +func (b *rawChunk) Encoding() chunkenc.Encoding { + return chunkenc.Encoding((*b)[0]) } -func (b rawChunk) Compact() {} -func (b rawChunk) Iterator(_ chunkenc.Iterator) chunkenc.Iterator { +func (b *rawChunk) Bytes() []byte { + return (*b)[1:] +} +func (b *rawChunk) Compact() {} + +func (b *rawChunk) Iterator(_ chunkenc.Iterator) chunkenc.Iterator { panic("invalid call") } -func (b rawChunk) Appender() (chunkenc.Appender, error) { +func (b *rawChunk) Appender() (chunkenc.Appender, error) { panic("invalid call") } -func (b rawChunk) NumSamples() int { +func (b *rawChunk) NumSamples() int { panic("invalid call") } @@ -3716,6 +3797,35 @@ type queryStats struct { DataDownloadedSizeSum units.Base2Bytes } +func (s *queryStats) add(dataType StoreDataType, dataCount int, dataSize int) { + s.mtx.Lock() + defer s.mtx.Unlock() + + switch dataType { + case PostingsFetched: + s.postingsFetched += dataCount + s.PostingsFetchedSizeSum += units.Base2Bytes(dataSize) + case PostingsTouched: + s.postingsTouched += dataCount + s.PostingsTouchedSizeSum += units.Base2Bytes(dataSize) + case SeriesFetched: + s.seriesFetched += dataCount + s.SeriesFetchedSizeSum += units.Base2Bytes(dataSize) + case SeriesTouched: + s.seriesTouched += dataCount + s.SeriesTouchedSizeSum += units.Base2Bytes(dataSize) + case ChunksFetched: + s.chunksFetched += dataCount + s.ChunksFetchedSizeSum += units.Base2Bytes(dataSize) + case ChunksTouched: + s.chunksTouched += dataCount + s.ChunksTouchedSizeSum += units.Base2Bytes(dataSize) + default: + return + } + s.DataDownloadedSizeSum += units.Base2Bytes(dataSize) +} + func (s *queryStats) merge(o *queryStats) { s.mtx.Lock() defer s.mtx.Unlock() @@ -3791,6 +3901,6 @@ func (s *queryStats) toHints() *hintspb.QueryStats { } // NewDefaultChunkBytesPool returns a chunk bytes pool with default settings. -func NewDefaultChunkBytesPool(maxChunkPoolBytes uint64) (pool.Bytes, error) { - return pool.NewBucketedBytes(chunkBytesPoolMinSize, chunkBytesPoolMaxSize, 2, maxChunkPoolBytes) +func NewDefaultChunkBytesPool(maxChunkPoolBytes uint64) (pool.Pool[byte], error) { + return pool.NewBucketedPool[byte](chunkBytesPoolMinSize, chunkBytesPoolMaxSize, 2, maxChunkPoolBytes) } diff --git a/pkg/store/bucket_e2e_test.go b/pkg/store/bucket_e2e_test.go index c91fb4096d..bee87898c6 100644 --- a/pkg/store/bucket_e2e_test.go +++ b/pkg/store/bucket_e2e_test.go @@ -555,6 +555,8 @@ func TestBucketStore_ManyParts_e2e(t *testing.T) { } func TestBucketStore_TimePartitioning_e2e(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithCancel(context.Background()) defer cancel() bkt := objstore.NewInMemBucket() @@ -608,6 +610,8 @@ func TestBucketStore_TimePartitioning_e2e(t *testing.T) { } func TestBucketStore_Series_ChunksLimiter_e2e(t *testing.T) { + t.Parallel() + // The query will fetch 2 series from 6 blocks, so we do expect to hit a total of 12 chunks. expectedChunks := uint64(2 * 6) @@ -677,6 +681,48 @@ func TestBucketStore_Series_ChunksLimiter_e2e(t *testing.T) { } } +func TestBucketStore_Series_CustomBytesLimiters_e2e(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + bkt := objstore.NewInMemBucket() + + dir := t.TempDir() + + s := prepareStoreWithTestBlocks(t, dir, bkt, false, NewChunksLimiterFactory(0), NewSeriesLimiterFactory(0), func(_ prometheus.Counter) BytesLimiter { + return &bytesLimiterMock{ + limitFunc: func(_ uint64, dataType StoreDataType) error { + if dataType == PostingsFetched { + return fmt.Errorf("error reserving data type: PostingsFetched") + } + + return nil + }, + } + }, emptyRelabelConfig, allowAllFilterConf) + testutil.Ok(t, s.store.SyncBlocks(ctx)) + + req := &storepb.SeriesRequest{ + Matchers: []storepb.LabelMatcher{ + {Type: storepb.LabelMatcher_EQ, Name: "a", Value: "1"}, + }, + MinTime: minTimeDuration.PrometheusTimestamp(), + MaxTime: maxTimeDuration.PrometheusTimestamp(), + } + + s.cache.SwapWith(noopCache{}) + srv := newStoreSeriesServer(ctx) + err := s.store.Series(req, srv) + + testutil.NotOk(t, err) + testutil.Assert(t, strings.Contains(err.Error(), "exceeded bytes limit")) + testutil.Assert(t, strings.Contains(err.Error(), "error reserving data type: PostingsFetched")) + status, ok := status.FromError(err) + testutil.Equals(t, true, ok) + testutil.Equals(t, codes.ResourceExhausted, status.Code()) +} + func TestBucketStore_LabelNames_e2e(t *testing.T) { objtesting.ForeachStore(t, func(t *testing.T, bkt objstore.Bucket) { ctx, cancel := context.WithCancel(context.Background()) @@ -782,6 +828,8 @@ func TestBucketStore_LabelNames_e2e(t *testing.T) { } func TestBucketStore_LabelNames_SeriesLimiter_e2e(t *testing.T) { + t.Parallel() + cases := map[string]struct { maxSeriesLimit uint64 expectedErr string @@ -940,6 +988,8 @@ func TestBucketStore_LabelValues_e2e(t *testing.T) { } func TestBucketStore_LabelValues_SeriesLimiter_e2e(t *testing.T) { + t.Parallel() + cases := map[string]struct { maxSeriesLimit uint64 expectedErr string diff --git a/pkg/store/bucket_test.go b/pkg/store/bucket_test.go index 60489256cf..e8dffd093b 100644 --- a/pkg/store/bucket_test.go +++ b/pkg/store/bucket_test.go @@ -48,6 +48,7 @@ import ( "github.com/thanos-io/objstore" "github.com/thanos-io/objstore/providers/filesystem" + "github.com/thanos-io/thanos/pkg/block" "github.com/thanos-io/thanos/pkg/block/indexheader" "github.com/thanos-io/thanos/pkg/block/metadata" @@ -62,13 +63,22 @@ import ( "github.com/thanos-io/thanos/pkg/store/storepb" storetestutil "github.com/thanos-io/thanos/pkg/store/storepb/testutil" "github.com/thanos-io/thanos/pkg/tenancy" - "github.com/thanos-io/thanos/pkg/testutil/custom" "github.com/thanos-io/thanos/pkg/testutil/e2eutil" ) var emptyRelabelConfig = make([]*relabel.Config, 0) +func TestRawChunkReset(t *testing.T) { + t.Parallel() + + r := rawChunk([]byte{1, 2}) + r.Reset([]byte{3, 4}) + testutil.Equals(t, []byte(r), []byte{3, 4}) +} + func TestBucketBlock_Property(t *testing.T) { + t.Parallel() + parameters := gopter.DefaultTestParameters() parameters.Rng.Seed(2000) parameters.MinSuccessfulTests = 20000 @@ -199,7 +209,7 @@ func TestBucketBlock_Property(t *testing.T) { } func TestBucketFilterExtLabelsMatchers(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() dir := t.TempDir() bkt, err := filesystem.NewBucket(dir) @@ -216,7 +226,7 @@ func TestBucketFilterExtLabelsMatchers(t *testing.T) { }, }, } - b, _ := newBucketBlock(context.Background(), log.NewNopLogger(), newBucketStoreMetrics(nil), meta, bkt, path.Join(dir, blockID.String()), nil, nil, nil, nil, nil, nil) + b, _ := newBucketBlock(context.Background(), newBucketStoreMetrics(nil), meta, bkt, path.Join(dir, blockID.String()), nil, nil, nil, nil, nil, nil) ms := []*labels.Matcher{ {Type: labels.MatchNotEqual, Name: "a", Value: "b"}, } @@ -227,7 +237,7 @@ func TestBucketFilterExtLabelsMatchers(t *testing.T) { {Type: labels.MatchNotEqual, Name: "a", Value: "a"}, } _, ok := b.FilterExtLabelsMatchers(ms) - testutil.Equals(t, ok, false) + testutil.Equals(t, ok, true) ms = []*labels.Matcher{ {Type: labels.MatchNotEqual, Name: "a", Value: "a"}, @@ -242,10 +252,22 @@ func TestBucketFilterExtLabelsMatchers(t *testing.T) { res, _ = b.FilterExtLabelsMatchers(ms) testutil.Equals(t, len(res), 1) testutil.Equals(t, res, ms) + + // validate that it can filter out ext labels that match non-equal matchers + ext, err := labels.NewMatcher(labels.MatchRegexp, "a", ".*") + if err != nil { + t.Error(err) + } + ms = []*labels.Matcher{ + {Type: labels.MatchNotEqual, Name: "a2", Value: "a"}, + } + res, _ = b.FilterExtLabelsMatchers(append(ms, ext)) + testutil.Equals(t, len(res), 1) + testutil.Equals(t, res, ms) } func TestBucketBlock_matchLabels(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() dir := t.TempDir() @@ -264,7 +286,7 @@ func TestBucketBlock_matchLabels(t *testing.T) { }, } - b, err := newBucketBlock(context.Background(), log.NewNopLogger(), newBucketStoreMetrics(nil), meta, bkt, path.Join(dir, blockID.String()), nil, nil, nil, nil, nil, nil) + b, err := newBucketBlock(context.Background(), newBucketStoreMetrics(nil), meta, bkt, path.Join(dir, blockID.String()), nil, nil, nil, nil, nil, nil) testutil.Ok(t, err) cases := []struct { @@ -341,7 +363,7 @@ func TestBucketBlock_matchLabels(t *testing.T) { } func TestBucketBlockSet_addGet(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() set := newBucketBlockSet(labels.Labels{}) @@ -452,7 +474,7 @@ func TestBucketBlockSet_addGet(t *testing.T) { } func TestBucketBlockSet_remove(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() set := newBucketBlockSet(labels.Labels{}) @@ -482,7 +504,7 @@ func TestBucketBlockSet_remove(t *testing.T) { } func TestBucketBlockSet_labelMatchers(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() set := newBucketBlockSet(labels.FromStrings("a", "b", "c", "d")) @@ -551,7 +573,7 @@ func TestBucketBlockSet_labelMatchers(t *testing.T) { } func TestGapBasedPartitioner_Partition(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() const maxGapSize = 1024 * 512 @@ -595,7 +617,7 @@ func TestGapBasedPartitioner_Partition(t *testing.T) { }, { input: [][2]int{ - // Mimick AllPostingsKey, where range specified whole range. + // Mimic AllPostingsKey, where range specified whole range. {1, 15}, {1, maxGapSize + 100}, {maxGapSize + 31, maxGapSize + 40}, @@ -611,6 +633,8 @@ func TestGapBasedPartitioner_Partition(t *testing.T) { } func TestBucketStoreConfig_validate(t *testing.T) { + t.Parallel() + tests := map[string]struct { config *BucketStore expected error @@ -637,7 +661,7 @@ func TestBucketStoreConfig_validate(t *testing.T) { } func TestBucketStore_TSDBInfo(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -658,6 +682,8 @@ func TestBucketStore_TSDBInfo(t *testing.T) { {mint: 3500, maxt: 5000, extLabels: labels.FromStrings("a", "b")}, {mint: 0, maxt: 1000, extLabels: labels.FromStrings("a", "c")}, {mint: 500, maxt: 2000, extLabels: labels.FromStrings("a", "c")}, + {mint: 0, maxt: 1000, extLabels: labels.FromStrings("a", "d")}, + {mint: 2000, maxt: 3000, extLabels: labels.FromStrings("a", "d")}, } { id1, err := e2eutil.CreateBlock(ctx, dir, series, 10, tt.mint, tt.maxt, tt.extLabels, 0, metadata.NoneFunc) testutil.Ok(t, err) @@ -694,7 +720,11 @@ func TestBucketStore_TSDBInfo(t *testing.T) { defer func() { testutil.Ok(t, bucketStore.Close()) }() testutil.Ok(t, bucketStore.SyncBlocks(ctx)) - testutil.Equals(t, bucketStore.TSDBInfos(), []infopb.TSDBInfo{ + infos := bucketStore.TSDBInfos() + slices.SortFunc(infos, func(a, b infopb.TSDBInfo) int { + return strings.Compare(a.Labels.String(), b.Labels.String()) + }) + testutil.Equals(t, infos, []infopb.TSDBInfo{ { Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{{Name: "a", Value: "b"}}}, MinTime: 0, @@ -710,50 +740,19 @@ func TestBucketStore_TSDBInfo(t *testing.T) { MinTime: 0, MaxTime: 2000, }, + { + Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{{Name: "a", Value: "d"}}}, + MinTime: 0, + MaxTime: 1000, + }, + { + Labels: labelpb.ZLabelSet{Labels: []labelpb.ZLabel{{Name: "a", Value: "d"}}}, + MinTime: 2000, + MaxTime: 3000, + }, }) } -func TestBucketStore_Info(t *testing.T) { - defer custom.TolerantVerifyLeak(t) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - dir := t.TempDir() - - chunkPool, err := NewDefaultChunkBytesPool(2e5) - testutil.Ok(t, err) - - bucketStore, err := NewBucketStore( - nil, - nil, - dir, - NewChunksLimiterFactory(0), - NewSeriesLimiterFactory(0), - NewBytesLimiterFactory(0), - NewGapBasedPartitioner(PartitionerMaxGapSize), - 20, - true, - DefaultPostingOffsetInMemorySampling, - false, - false, - 0, - WithChunkPool(chunkPool), - WithFilterConfig(allowAllFilterConf), - ) - testutil.Ok(t, err) - defer func() { testutil.Ok(t, bucketStore.Close()) }() - - resp, err := bucketStore.Info(ctx, &storepb.InfoRequest{}) - testutil.Ok(t, err) - - testutil.Equals(t, storepb.StoreType_STORE, resp.StoreType) - testutil.Equals(t, int64(math.MaxInt64), resp.MinTime) - testutil.Equals(t, int64(math.MinInt64), resp.MaxTime) - testutil.Equals(t, []labelpb.ZLabelSet(nil), resp.LabelSets) - testutil.Equals(t, []labelpb.ZLabel(nil), resp.Labels) -} - type recorder struct { mtx sync.Mutex objstore.Bucket @@ -779,6 +778,8 @@ func (r *recorder) GetRange(ctx context.Context, name string, off, length int64) } func TestBucketStore_Sharding(t *testing.T) { + t.Parallel() + ctx := context.Background() logger := log.NewNopLogger() @@ -1000,14 +1001,6 @@ func testSharding(t *testing.T, reuseDisk string, bkt objstore.Bucket, all ...ul }) testutil.Equals(t, sc.expectedIDs, ids) - // Check Info endpoint. - resp, err := bucketStore.Info(context.Background(), &storepb.InfoRequest{}) - testutil.Ok(t, err) - - testutil.Equals(t, storepb.StoreType_STORE, resp.StoreType) - testutil.Equals(t, []labelpb.ZLabel(nil), resp.Labels) - testutil.Equals(t, sc.expectedAdvLabels, resp.LabelSets) - // Make sure we don't download files we did not expect to. // Regression test: https://github.com/thanos-io/thanos/issues/1664 @@ -1065,6 +1058,8 @@ func expectedTouchedBlockOps(all, expected, cached []ulid.ULID) []string { // Regression tests against: https://github.com/thanos-io/thanos/issues/1983. func TestReadIndexCache_LoadSeries(t *testing.T) { + t.Parallel() + bkt := objstore.NewInMemBucket() ctx := context.Background() @@ -1076,10 +1071,10 @@ func TestReadIndexCache_LoadSeries(t *testing.T) { }, }, bkt: bkt, - logger: log.NewNopLogger(), metrics: s, indexCache: noopCache{}, } + logger := log.NewNopLogger() buf := encoding.Encbuf{} buf.PutByte(0) @@ -1096,6 +1091,7 @@ func TestReadIndexCache_LoadSeries(t *testing.T) { block: b, stats: &queryStats{}, loadedSeries: map[storage.SeriesRef][]byte{}, + logger: logger, } // Success with no refetches. @@ -1137,6 +1133,8 @@ func TestReadIndexCache_LoadSeries(t *testing.T) { } func TestBucketIndexReader_ExpandedPostings(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) tmpDir := t.TempDir() @@ -1186,7 +1184,7 @@ func uploadTestBlock(t testing.TB, tmpDir string, bkt objstore.Bucket, series in dir := filepath.Join(tmpDir, "tmp") testutil.Ok(t, os.MkdirAll(dir, os.ModePerm)) - id := createBlockFromHead(t, dir, h) + id := storetestutil.CreateBlockFromHead(t, dir, h) bdir := filepath.Join(dir, id.String()) meta, err := metadata.ReadFromDir(bdir) testutil.Ok(t, err) @@ -1227,19 +1225,7 @@ func appendTestData(t testing.TB, app storage.Appender, series int) { testutil.Ok(t, app.Commit()) } -func createBlockFromHead(t testing.TB, dir string, head *tsdb.Head) ulid.ULID { - compactor, err := tsdb.NewLeveledCompactor(context.Background(), nil, log.NewNopLogger(), []int64{1000000}, nil, nil) - testutil.Ok(t, err) - testutil.Ok(t, os.MkdirAll(dir, 0777)) - - // Add +1 millisecond to block maxt because block intervals are half-open: [b.MinTime, b.MaxTime). - // Because of this block intervals are always +1 than the total samples it includes. - ulid, err := compactor.Write(dir, head, head.MinTime(), head.MaxTime()+1, nil) - testutil.Ok(t, err) - return ulid -} - -// Very similar benchmark to ths: https://github.com/prometheus/prometheus/blob/1d1732bc25cc4b47f513cb98009a4eb91879f175/tsdb/querier_bench_test.go#L82, +// Very similar benchmark to this: https://github.com/prometheus/prometheus/blob/1d1732bc25cc4b47f513cb98009a4eb91879f175/tsdb/querier_bench_test.go#L82, // but with postings results check when run as test. func benchmarkExpandedPostings( t testutil.TB, @@ -1273,6 +1259,7 @@ func benchmarkExpandedPostings( }) iRegexBigValueSet := labels.MustNewMatcher(labels.MatchRegexp, "uniq", strings.Join(bigValueSet, "|")) + logger := log.NewNopLogger() series = series / 5 cases := []struct { name string @@ -1305,7 +1292,6 @@ func benchmarkExpandedPostings( for _, c := range cases { t.Run(c.name, func(t testutil.TB) { b := &bucketBlock{ - logger: log.NewNopLogger(), metrics: newBucketStoreMetrics(nil), indexHeaderReader: r, indexCache: noopCache{}, @@ -1314,7 +1300,7 @@ func benchmarkExpandedPostings( partitioner: NewGapBasedPartitioner(PartitionerMaxGapSize), } - indexr := newBucketIndexReader(b) + indexr := newBucketIndexReader(b, logger) t.ResetTimer() for i := 0; i < t.N(); i++ { @@ -1327,6 +1313,8 @@ func benchmarkExpandedPostings( } func TestExpandedPostingsEmptyPostings(t *testing.T) { + t.Parallel() + tmpDir := t.TempDir() bkt, err := filesystem.NewBucket(filepath.Join(tmpDir, "bkt")) @@ -1338,7 +1326,6 @@ func TestExpandedPostingsEmptyPostings(t *testing.T) { r, err := indexheader.NewBinaryReader(context.Background(), log.NewNopLogger(), bkt, tmpDir, id, DefaultPostingOffsetInMemorySampling, indexheader.NewBinaryReaderMetrics(nil)) testutil.Ok(t, err) b := &bucketBlock{ - logger: log.NewNopLogger(), metrics: newBucketStoreMetrics(nil), indexHeaderReader: r, indexCache: noopCache{}, @@ -1347,7 +1334,8 @@ func TestExpandedPostingsEmptyPostings(t *testing.T) { partitioner: NewGapBasedPartitioner(PartitionerMaxGapSize), } - indexr := newBucketIndexReader(b) + logger := log.NewNopLogger() + indexr := newBucketIndexReader(b, logger) matcher1 := labels.MustNewMatcher(labels.MatchEqual, "j", "foo") // Match nothing. matcher2 := labels.MustNewMatcher(labels.MatchRegexp, "i", "500.*") @@ -1361,6 +1349,8 @@ func TestExpandedPostingsEmptyPostings(t *testing.T) { } func TestLazyExpandedPostingsEmptyPostings(t *testing.T) { + t.Parallel() + tmpDir := t.TempDir() bkt, err := filesystem.NewBucket(filepath.Join(tmpDir, "bkt")) @@ -1372,7 +1362,6 @@ func TestLazyExpandedPostingsEmptyPostings(t *testing.T) { r, err := indexheader.NewBinaryReader(context.Background(), log.NewNopLogger(), bkt, tmpDir, id, DefaultPostingOffsetInMemorySampling, indexheader.NewBinaryReaderMetrics(nil)) testutil.Ok(t, err) b := &bucketBlock{ - logger: log.NewNopLogger(), metrics: newBucketStoreMetrics(nil), indexHeaderReader: r, indexCache: noopCache{}, @@ -1382,7 +1371,8 @@ func TestLazyExpandedPostingsEmptyPostings(t *testing.T) { estimatedMaxSeriesSize: 20, } - indexr := newBucketIndexReader(b) + logger := log.NewNopLogger() + indexr := newBucketIndexReader(b, logger) // matcher1 and matcher2 will match nothing after intersection. matcher1 := labels.MustNewMatcher(labels.MatchEqual, "j", "foo") matcher2 := labels.MustNewMatcher(labels.MatchRegexp, "n", "1_.*") @@ -1396,6 +1386,8 @@ func TestLazyExpandedPostingsEmptyPostings(t *testing.T) { } func TestBucketSeries(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) storetestutil.RunSeriesInterestingCases(tb, 200e3, 200e3, func(t testutil.TB, samplesPerSeries, series int) { benchBucketSeries(t, chunkenc.ValFloat, false, false, samplesPerSeries, series, 1) @@ -1403,6 +1395,8 @@ func TestBucketSeries(t *testing.T) { } func TestBucketSeriesLazyExpandedPostings(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) storetestutil.RunSeriesInterestingCases(tb, 200e3, 200e3, func(t testutil.TB, samplesPerSeries, series int) { benchBucketSeries(t, chunkenc.ValFloat, false, true, samplesPerSeries, series, 1) @@ -1410,6 +1404,8 @@ func TestBucketSeriesLazyExpandedPostings(t *testing.T) { } func TestBucketHistogramSeries(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) storetestutil.RunSeriesInterestingCases(tb, 200e3, 200e3, func(t testutil.TB, samplesPerSeries, series int) { benchBucketSeries(t, chunkenc.ValHistogram, false, false, samplesPerSeries, series, 1) @@ -1417,6 +1413,8 @@ func TestBucketHistogramSeries(t *testing.T) { } func TestBucketFloatHistogramSeries(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) storetestutil.RunSeriesInterestingCases(tb, 200e3, 200e3, func(t testutil.TB, samplesPerSeries, series int) { benchBucketSeries(t, chunkenc.ValFloatHistogram, false, false, samplesPerSeries, series, 1) @@ -1424,6 +1422,8 @@ func TestBucketFloatHistogramSeries(t *testing.T) { } func TestBucketSkipChunksSeries(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) storetestutil.RunSeriesInterestingCases(tb, 200e3, 200e3, func(t testutil.TB, samplesPerSeries, series int) { benchBucketSeries(t, chunkenc.ValFloat, true, false, samplesPerSeries, series, 1) @@ -1487,7 +1487,7 @@ func benchBucketSeries(t testutil.TB, sampleType chunkenc.ValueType, skipChunk, SkipChunks: t.IsBenchmark() || skipChunk, SampleType: sampleType, }) - id := createBlockFromHead(t, blockDir, head) + id := storetestutil.CreateBlockFromHead(t, blockDir, head) testutil.Ok(t, head.Close()) blockIDDir := filepath.Join(blockDir, id.String()) meta, err := metadata.ReadFromDir(blockIDDir) @@ -1523,7 +1523,7 @@ func benchBucketSeries(t testutil.TB, sampleType chunkenc.ValueType, skipChunk, f, err := block.NewRawMetaFetcher(logger, ibkt, baseBlockIDsFetcher) testutil.Ok(t, err) - chunkPool, err := pool.NewBucketedBytes(chunkBytesPoolMinSize, chunkBytesPoolMaxSize, 2, 1e9) // 1GB. + chunkPool, err := pool.NewBucketedPool[byte](chunkBytesPoolMinSize, chunkBytesPoolMaxSize, 2, 1e9) // 1GB. testutil.Ok(t, err) st, err := NewBucketStore( @@ -1630,7 +1630,7 @@ func (m fakePool) Get(sz int) (*[]byte, error) { func (m fakePool) Put(_ *[]byte) {} type mockedPool struct { - parent pool.Bytes + parent pool.Pool[byte] balance atomic.Uint64 gets atomic.Uint64 } @@ -1652,6 +1652,8 @@ func (m *mockedPool) Put(b *[]byte) { // Regression test against: https://github.com/thanos-io/thanos/issues/2147. func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { + t.Parallel() + tmpDir := t.TempDir() bkt, err := filesystem.NewBucket(filepath.Join(tmpDir, "bkt")) @@ -1665,7 +1667,7 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { Source: metadata.TestSource, } - chunkPool, err := pool.NewBucketedBytes(chunkBytesPoolMinSize, chunkBytesPoolMaxSize, 2, 100e7) + chunkPool, err := pool.NewBucketedPool[byte](chunkBytesPoolMinSize, chunkBytesPoolMaxSize, 2, 100e7) testutil.Ok(t, err) indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(logger, nil, nil, storecache.InMemoryIndexCacheConfig{ @@ -1704,7 +1706,7 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { testutil.Ok(t, app.Commit()) blockDir := filepath.Join(tmpDir, "tmp") - id := createBlockFromHead(t, blockDir, h) + id := storetestutil.CreateBlockFromHead(t, blockDir, h) meta, err := metadata.InjectThanos(log.NewNopLogger(), filepath.Join(blockDir, id.String()), thanosMeta, nil) testutil.Ok(t, err) @@ -1712,7 +1714,6 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { b1 = &bucketBlock{ indexCache: indexCache, - logger: logger, metrics: newBucketStoreMetrics(nil), bkt: bkt, meta: meta, @@ -1745,7 +1746,7 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { testutil.Ok(t, app.Commit()) blockDir := filepath.Join(tmpDir, "tmp2") - id := createBlockFromHead(t, blockDir, h) + id := storetestutil.CreateBlockFromHead(t, blockDir, h) meta, err := metadata.InjectThanos(log.NewNopLogger(), filepath.Join(blockDir, id.String()), thanosMeta, nil) testutil.Ok(t, err) @@ -1753,7 +1754,6 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { b2 = &bucketBlock{ indexCache: indexCache, - logger: logger, metrics: newBucketStoreMetrics(nil), bkt: bkt, meta: meta, @@ -1785,6 +1785,7 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { seriesLimiterFactory: NewSeriesLimiterFactory(0), bytesLimiterFactory: NewBytesLimiterFactory(0), seriesBatchSize: SeriesBatchSize, + requestLoggerFunc: NoopRequestLoggerFunc, } t.Run("invoke series for one block. Fill the cache on the way.", func(t *testing.T) { @@ -1837,6 +1838,8 @@ func TestBucketSeries_OneBlock_InMemIndexCacheSegfault(t *testing.T) { } func TestSeries_RequestAndResponseHints(t *testing.T) { + t.Parallel() + tb, store, seriesSet1, seriesSet2, block1, block2, close := setupStoreForHintsTest(t) defer close() @@ -1954,6 +1957,8 @@ func TestSeries_RequestAndResponseHints(t *testing.T) { } func TestSeries_ErrorUnmarshallingRequestHints(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) tmpDir := t.TempDir() @@ -2015,6 +2020,8 @@ func TestSeries_ErrorUnmarshallingRequestHints(t *testing.T) { } func TestSeries_BlockWithMultipleChunks(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) tmpDir := t.TempDir() @@ -2039,7 +2046,7 @@ func TestSeries_BlockWithMultipleChunks(t *testing.T) { testutil.Ok(t, app.Commit()) } - blk := createBlockFromHead(t, headOpts.ChunkDirRoot, h) + blk := storetestutil.CreateBlockFromHead(t, headOpts.ChunkDirRoot, h) thanosMeta := metadata.Thanos{ Labels: labels.FromStrings("ext1", "1").Map(), @@ -2145,6 +2152,8 @@ func TestSeries_BlockWithMultipleChunks(t *testing.T) { } func TestSeries_SeriesSortedWithoutReplicaLabels(t *testing.T) { + t.Parallel() + tests := map[string]struct { series [][]labels.Labels replicaLabels []string @@ -2316,6 +2325,8 @@ func mustMarshalAny(pb proto.Message) *types.Any { } func TestBigEndianPostingsCount(t *testing.T) { + t.Parallel() + const count = 1000 raw := make([]byte, count*4) @@ -2352,7 +2363,7 @@ func createBlockWithOneSeriesWithStep(t testutil.TB, dir string, lbls labels.Lab } testutil.Ok(t, app.Commit()) - return createBlockFromHead(t, dir, h) + return storetestutil.CreateBlockFromHead(t, dir, h) } func setupStoreForHintsTest(t *testing.T) (testutil.TB, *BucketStore, []*storepb.Series, []*storepb.Series, ulid.ULID, ulid.ULID, func()) { @@ -2389,7 +2400,7 @@ func setupStoreForHintsTest(t *testing.T) (testutil.TB, *BucketStore, []*storepb PrependLabels: extLset, Random: random, }) - block1 := createBlockFromHead(t, bktDir, head) + block1 := storetestutil.CreateBlockFromHead(t, bktDir, head) testutil.Ok(t, head.Close()) head2, seriesSet2 := storetestutil.CreateHeadWithSeries(t, 1, storetestutil.HeadGenOptions{ TSDBDir: filepath.Join(tmpDir, "1"), @@ -2398,7 +2409,7 @@ func setupStoreForHintsTest(t *testing.T) (testutil.TB, *BucketStore, []*storepb PrependLabels: extLset, Random: random, }) - block2 := createBlockFromHead(t, bktDir, head2) + block2 := storetestutil.CreateBlockFromHead(t, bktDir, head2) testutil.Ok(t, head2.Close()) for _, blockID := range []ulid.ULID{block1, block2} { @@ -2444,6 +2455,8 @@ func setupStoreForHintsTest(t *testing.T) (testutil.TB, *BucketStore, []*storepb } func TestLabelNamesAndValuesHints(t *testing.T) { + t.Parallel() + _, store, seriesSet1, seriesSet2, block1, block2, close := setupStoreForHintsTest(t) defer close() @@ -2583,6 +2596,8 @@ func TestLabelNamesAndValuesHints(t *testing.T) { } func TestSeries_ChunksHaveHashRepresentation(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) tmpDir := t.TempDir() @@ -2602,7 +2617,7 @@ func TestSeries_ChunksHaveHashRepresentation(t *testing.T) { } testutil.Ok(t, app.Commit()) - blk := createBlockFromHead(t, headOpts.ChunkDirRoot, h) + blk := storetestutil.CreateBlockFromHead(t, headOpts.ChunkDirRoot, h) thanosMeta := metadata.Thanos{ Labels: labels.FromStrings("ext1", "1").Map(), @@ -2746,11 +2761,11 @@ func BenchmarkBucketBlock_readChunkRange(b *testing.B) { testutil.Ok(b, block.Upload(context.Background(), logger, bkt, filepath.Join(tmpDir, blockID.String()), metadata.NoneFunc)) // Create a chunk pool with buckets between 8B and 32KB. - chunkPool, err := pool.NewBucketedBytes(8, 32*1024, 2, 1e10) + chunkPool, err := pool.NewBucketedPool[byte](8, 32*1024, 2, 1e10) testutil.Ok(b, err) // Create a bucket block with only the dependencies we need for the benchmark. - blk, err := newBucketBlock(context.Background(), logger, newBucketStoreMetrics(nil), blockMeta, bkt, tmpDir, nil, chunkPool, nil, nil, nil, nil) + blk, err := newBucketBlock(context.Background(), newBucketStoreMetrics(nil), blockMeta, bkt, tmpDir, nil, chunkPool, nil, nil, nil, nil) testutil.Ok(b, err) b.ResetTimer() @@ -2759,7 +2774,7 @@ func BenchmarkBucketBlock_readChunkRange(b *testing.B) { offset := int64(0) length := readLengths[n%len(readLengths)] - _, err := blk.readChunkRange(ctx, 0, offset, length, byteRanges{{offset: 0, length: int(length)}}) + _, err := blk.readChunkRange(ctx, 0, offset, length, byteRanges{{offset: 0, length: int(length)}}, logger) if err != nil { b.Fatal(err.Error()) } @@ -2801,7 +2816,7 @@ func prepareBucket(b *testing.B, resolutionLevel compact.ResolutionLevel) (*buck Random: rand.New(rand.NewSource(120)), SkipChunks: true, }) - blockID := createBlockFromHead(b, tmpDir, head) + blockID := storetestutil.CreateBlockFromHead(b, tmpDir, head) // Upload the block to the bucket. thanosMeta := metadata.Thanos{ @@ -2839,7 +2854,7 @@ func prepareBucket(b *testing.B, resolutionLevel compact.ResolutionLevel) (*buck testutil.Ok(b, err) // Create a bucket block with only the dependencies we need for the benchmark. - blk, err := newBucketBlock(context.Background(), logger, newBucketStoreMetrics(nil), blockMeta, bkt, tmpDir, indexCache, chunkPool, indexHeaderReader, partitioner, nil, nil) + blk, err := newBucketBlock(context.Background(), newBucketStoreMetrics(nil), blockMeta, bkt, tmpDir, indexCache, chunkPool, indexHeaderReader, partitioner, nil, nil) testutil.Ok(b, err) return blk, blockMeta } @@ -2934,9 +2949,23 @@ func BenchmarkDownsampledBlockSeries(b *testing.B) { } func TestExpandPostingsWithContextCancel(t *testing.T) { + t.Parallel() + + // Not enough number of postings to check context cancellation. p := index.NewListPostings([]storage.SeriesRef{1, 2, 3, 4, 5, 6, 7, 8}) ctx, cancel := context.WithCancel(context.Background()) + cancel() + _, err := ExpandPostingsWithContext(ctx, p) + testutil.Ok(t, err) + + refs := make([]storage.SeriesRef, 0) + for i := 0; i < 128; i++ { + refs = append(refs, storage.SeriesRef(i)) + } + p = index.NewListPostings(refs) + ctx, cancel = context.WithCancel(context.Background()) + cancel() res, err := ExpandPostingsWithContext(ctx, p) testutil.NotOk(t, err) @@ -2962,6 +2991,8 @@ func samePostingGroup(a, b *postingGroup) bool { } func TestMatchersToPostingGroup(t *testing.T) { + t.Parallel() + ctx := context.Background() for _, tc := range []struct { name string @@ -3317,6 +3348,8 @@ func TestMatchersToPostingGroup(t *testing.T) { } func TestPostingGroupMerge(t *testing.T) { + t.Parallel() + for _, tc := range []struct { name string group1 *postingGroup @@ -3443,6 +3476,8 @@ func TestPostingGroupMerge(t *testing.T) { // TestExpandedPostings is a test whether there is a race between multiple ExpandPostings() calls. func TestExpandedPostingsRace(t *testing.T) { + t.Parallel() + const blockCount = 10 tmpDir := t.TempDir() @@ -3455,6 +3490,7 @@ func TestExpandedPostingsRace(t *testing.T) { testutil.Ok(t, bkt.Close()) }) + logger := log.NewNopLogger() // Create a block. head, _ := storetestutil.CreateHeadWithSeries(t, 0, storetestutil.HeadGenOptions{ TSDBDir: filepath.Join(tmpDir, "head"), @@ -3465,7 +3501,7 @@ func TestExpandedPostingsRace(t *testing.T) { Random: rand.New(rand.NewSource(120)), SkipChunks: true, }) - blockID := createBlockFromHead(t, tmpDir, head) + blockID := storetestutil.CreateBlockFromHead(t, tmpDir, head) bucketBlocks := make([]*bucketBlock, 0, blockCount) @@ -3494,7 +3530,6 @@ func TestExpandedPostingsRace(t *testing.T) { blk, err := newBucketBlock( context.Background(), - log.NewLogfmtLogger(os.Stderr), newBucketStoreMetrics(nil), m, bkt, @@ -3511,7 +3546,7 @@ func TestExpandedPostingsRace(t *testing.T) { bucketBlocks = append(bucketBlocks, blk) } - tm, cancel := context.WithTimeout(context.Background(), 40*time.Second) + tm, cancel := context.WithTimeout(context.Background(), 10*time.Second) t.Cleanup(cancel) l := sync.Mutex{} @@ -3536,10 +3571,9 @@ func TestExpandedPostingsRace(t *testing.T) { wg := &sync.WaitGroup{} for i, bb := range bucketBlocks { wg.Add(1) - i := i - bb := bb + go func(i int, bb *bucketBlock) { - refs, err := bb.indexReader().ExpandedPostings(context.Background(), m, NewBytesLimiterFactory(0)(nil), false, dummyCounter, tenancy.DefaultTenant) + refs, err := bb.indexReader(logger).ExpandedPostings(context.Background(), m, NewBytesLimiterFactory(0)(nil), false, dummyCounter, tenancy.DefaultTenant) testutil.Ok(t, err) defer wg.Done() @@ -3557,6 +3591,8 @@ func TestExpandedPostingsRace(t *testing.T) { } func TestBucketIndexReader_decodeCachedPostingsErrors(t *testing.T) { + t.Parallel() + bir := bucketIndexReader{stats: &queryStats{}} t.Run("should return error on broken cached postings without snappy prefix", func(t *testing.T) { _, _, err := bir.decodeCachedPostings([]byte("foo")) @@ -3569,6 +3605,8 @@ func TestBucketIndexReader_decodeCachedPostingsErrors(t *testing.T) { } func TestBucketStoreDedupOnBlockSeriesSet(t *testing.T) { + t.Parallel() + logger := log.NewNopLogger() tmpDir := t.TempDir() bktDir := filepath.Join(tmpDir, "bkt") @@ -3602,7 +3640,7 @@ func TestBucketStoreDedupOnBlockSeriesSet(t *testing.T) { testutil.Ok(t, err) testutil.Ok(t, app.Commit()) - id := createBlockFromHead(t, auxDir, h) + id := storetestutil.CreateBlockFromHead(t, auxDir, h) auxBlockDir := filepath.Join(auxDir, id.String()) _, err = metadata.InjectThanos(log.NewNopLogger(), auxBlockDir, metadata.Thanos{ @@ -3665,6 +3703,8 @@ func TestBucketStoreDedupOnBlockSeriesSet(t *testing.T) { } func TestQueryStatsMerge(t *testing.T) { + t.Parallel() + s := &queryStats{ blocksQueried: 1, postingsTouched: 1, @@ -3785,6 +3825,8 @@ func TestQueryStatsMerge(t *testing.T) { } func TestBucketStoreStreamingSeriesLimit(t *testing.T) { + t.Parallel() + logger := log.NewNopLogger() tmpDir := t.TempDir() bktDir := filepath.Join(tmpDir, "bkt") @@ -3821,7 +3863,7 @@ func TestBucketStoreStreamingSeriesLimit(t *testing.T) { testutil.Ok(t, err) testutil.Ok(t, app.Commit()) - id := createBlockFromHead(t, auxDir, h) + id := storetestutil.CreateBlockFromHead(t, auxDir, h) auxBlockDir := filepath.Join(auxDir, id.String()) _, err = metadata.InjectThanos(log.NewNopLogger(), auxBlockDir, metadata.Thanos{ @@ -3842,6 +3884,9 @@ func TestBucketStoreStreamingSeriesLimit(t *testing.T) { }) testutil.Ok(t, err) + firstBytesLimiterChecked := false + secondBytesLimiterChecked := false + // Set series limit to 2. Only pass if series limiter applies // for lazy postings only. bucketStore, err := NewBucketStore( @@ -3850,7 +3895,24 @@ func TestBucketStoreStreamingSeriesLimit(t *testing.T) { "", NewChunksLimiterFactory(10e6), NewSeriesLimiterFactory(2), - NewBytesLimiterFactory(10e6), + func(_ prometheus.Counter) BytesLimiter { + return &compositeBytesLimiterMock{ + limiters: []BytesLimiter{ + &bytesLimiterMock{ + limitFunc: func(_ uint64, _ StoreDataType) error { + firstBytesLimiterChecked = true + return nil + }, + }, + &bytesLimiterMock{ + limitFunc: func(_ uint64, _ StoreDataType) error { + secondBytesLimiterChecked = true + return nil + }, + }, + }, + } + }, NewGapBasedPartitioner(PartitionerMaxGapSize), 20, true, @@ -3881,4 +3943,164 @@ func TestBucketStoreStreamingSeriesLimit(t *testing.T) { srv := newStoreSeriesServer(context.Background()) testutil.Ok(t, bucketStore.Series(req, srv)) testutil.Equals(t, 2, len(srv.SeriesSet)) + testutil.Equals(t, true, firstBytesLimiterChecked) + testutil.Equals(t, true, secondBytesLimiterChecked) +} + +type bytesLimiterMock struct { + limitFunc func(uint64, StoreDataType) error +} + +func (m *bytesLimiterMock) ReserveWithType(num uint64, dataType StoreDataType) error { + return m.limitFunc(num, dataType) +} + +type compositeBytesLimiterMock struct { + limiters []BytesLimiter +} + +func (m *compositeBytesLimiterMock) ReserveWithType(num uint64, dataType StoreDataType) error { + for _, l := range m.limiters { + if err := l.ReserveWithType(num, dataType); err != nil { + return err + } + } + return nil +} + +func TestBucketStoreMetadataLimit(t *testing.T) { + t.Parallel() + + tb := testutil.NewTB(t) + + tmpDir := t.TempDir() + + bkt, err := filesystem.NewBucket(filepath.Join(tmpDir, "bkt")) + testutil.Ok(tb, err) + defer func() { testutil.Ok(tb, bkt.Close()) }() + + uploadTestBlock(tb, tmpDir, bkt, 30000) + + instrBkt := objstore.WithNoopInstr(bkt) + logger := log.NewNopLogger() + + // Instance a real bucket store we'll use to query the series. + baseBlockIDsFetcher := block.NewConcurrentLister(logger, instrBkt) + fetcher, err := block.NewMetaFetcher(logger, 10, instrBkt, baseBlockIDsFetcher, tmpDir, nil, nil) + testutil.Ok(tb, err) + + indexCache, err := storecache.NewInMemoryIndexCacheWithConfig(logger, nil, nil, storecache.InMemoryIndexCacheConfig{}) + testutil.Ok(tb, err) + + store, err := NewBucketStore( + instrBkt, + fetcher, + tmpDir, + NewChunksLimiterFactory(0), + NewSeriesLimiterFactory(0), + NewBytesLimiterFactory(0), + NewGapBasedPartitioner(PartitionerMaxGapSize), + 10, + false, + DefaultPostingOffsetInMemorySampling, + true, + false, + 0, + WithLogger(logger), + WithIndexCache(indexCache), + ) + testutil.Ok(tb, err) + testutil.Ok(tb, store.SyncBlocks(context.Background())) + + seriesTests := map[string]struct { + limit int64 + expectedResults int + }{ + "series without limit": { + expectedResults: 12000, + }, + "series with limit": { + limit: 11000, + expectedResults: 11000, + }, + } + + for testName, testData := range seriesTests { + t.Run(testName, func(t *testing.T) { + req := &storepb.SeriesRequest{ + MinTime: timestamp.FromTime(minTime), + MaxTime: timestamp.FromTime(maxTime), + Limit: testData.limit, + Matchers: []storepb.LabelMatcher{ + {Type: storepb.LabelMatcher_EQ, Name: "j", Value: "foo"}, + }, + } + + srv := newStoreSeriesServer(context.Background()) + err = store.Series(req, srv) + testutil.Ok(t, err) + testutil.Assert(t, len(srv.SeriesSet) == testData.expectedResults) + }) + } + + labelNamesTests := map[string]struct { + limit int64 + expectedResults []string + }{ + "label names without limit": { + expectedResults: []string{"ext1", "i", "j", "n", "uniq"}, + }, + "label names with limit": { + limit: 3, + expectedResults: []string{"ext1", "i", "j"}, + }, + } + + for testName, testData := range labelNamesTests { + t.Run(testName, func(t *testing.T) { + req := &storepb.LabelNamesRequest{ + Start: timestamp.FromTime(minTime), + End: timestamp.FromTime(maxTime), + Limit: testData.limit, + Matchers: []storepb.LabelMatcher{ + {Type: storepb.LabelMatcher_EQ, Name: "j", Value: "foo"}, + }, + } + + resp, err := store.LabelNames(context.Background(), req) + testutil.Ok(t, err) + testutil.Equals(t, testData.expectedResults, resp.Names) + }) + } + + labelValuesTests := map[string]struct { + limit int64 + expectedResults []string + }{ + "label values without limit": { + expectedResults: []string{"bar", "foo"}, + }, + "label values with limit": { + limit: 1, + expectedResults: []string{"bar"}, + }, + } + + for testName, testData := range labelValuesTests { + t.Run(testName, func(t *testing.T) { + req := &storepb.LabelValuesRequest{ + Start: timestamp.FromTime(minTime), + End: timestamp.FromTime(maxTime), + Label: "j", + Limit: testData.limit, + Matchers: []storepb.LabelMatcher{ + {Type: storepb.LabelMatcher_RE, Name: "j", Value: "(foo|bar)"}, + }, + } + + resp, err := store.LabelValues(context.Background(), req) + testutil.Ok(t, err) + testutil.Equals(t, testData.expectedResults, resp.Values) + }) + } } diff --git a/pkg/store/cache/inmemory.go b/pkg/store/cache/inmemory.go index 42e6de55a7..3a8ddbb86d 100644 --- a/pkg/store/cache/inmemory.go +++ b/pkg/store/cache/inmemory.go @@ -30,7 +30,12 @@ var ( } ) -const maxInt = int(^uint(0) >> 1) +const ( + maxInt = int(^uint(0) >> 1) + + // checkContextEveryNIterations is used in some tight loops to check if the context is done. + checkContextEveryNIterations = 128 +) type InMemoryIndexCache struct { mtx sync.Mutex @@ -302,11 +307,13 @@ func (c *InMemoryIndexCache) FetchMultiPostings(ctx context.Context, blockID uli blockIDKey := blockID.String() requests := 0 hit := 0 - for _, key := range keys { - if ctx.Err() != nil { - c.commonMetrics.RequestTotal.WithLabelValues(CacheTypePostings, tenant).Add(float64(requests)) - c.commonMetrics.HitsTotal.WithLabelValues(CacheTypePostings, tenant).Add(float64(hit)) - return hits, misses + for i, key := range keys { + if (i+1)%checkContextEveryNIterations == 0 { + if ctx.Err() != nil { + c.commonMetrics.RequestTotal.WithLabelValues(CacheTypePostings, tenant).Add(float64(requests)) + c.commonMetrics.HitsTotal.WithLabelValues(CacheTypePostings, tenant).Add(float64(hit)) + return hits, misses + } } requests++ if b, ok := c.get(CacheKey{blockIDKey, CacheKeyPostings(key), ""}); ok { @@ -363,11 +370,13 @@ func (c *InMemoryIndexCache) FetchMultiSeries(ctx context.Context, blockID ulid. blockIDKey := blockID.String() requests := 0 hit := 0 - for _, id := range ids { - if ctx.Err() != nil { - c.commonMetrics.RequestTotal.WithLabelValues(CacheTypeSeries, tenant).Add(float64(requests)) - c.commonMetrics.HitsTotal.WithLabelValues(CacheTypeSeries, tenant).Add(float64(hit)) - return hits, misses + for i, id := range ids { + if (i+1)%checkContextEveryNIterations == 0 { + if ctx.Err() != nil { + c.commonMetrics.RequestTotal.WithLabelValues(CacheTypeSeries, tenant).Add(float64(requests)) + c.commonMetrics.HitsTotal.WithLabelValues(CacheTypeSeries, tenant).Add(float64(hit)) + return hits, misses + } } requests++ if b, ok := c.get(CacheKey{blockIDKey, CacheKeySeries(id), ""}); ok { diff --git a/pkg/store/cache/tracing_index_cache.go b/pkg/store/cache/tracing_index_cache.go index a72ce0d664..38a0f61822 100644 --- a/pkg/store/cache/tracing_index_cache.go +++ b/pkg/store/cache/tracing_index_cache.go @@ -66,8 +66,8 @@ func (c *TracingIndexCache) FetchExpandedPostings(ctx context.Context, blockID u return data, exists } -// StoreSeries stores a single series. Skip intrumenting this method -// excessive spans as a single request can store millions of serieses. +// StoreSeries stores a single series. Skip instrumenting this method +// excessive spans as a single request can store millions of series. func (c *TracingIndexCache) StoreSeries(blockID ulid.ULID, id storage.SeriesRef, v []byte, tenant string) { c.cache.StoreSeries(blockID, id, v, tenant) } diff --git a/pkg/store/flushable.go b/pkg/store/flushable.go index 6be9c544c5..33680c3c89 100644 --- a/pkg/store/flushable.go +++ b/pkg/store/flushable.go @@ -16,6 +16,7 @@ type sortingStrategy uint64 const ( sortingStrategyStore sortingStrategy = iota + 1 sortingStrategyNone + sortingStrategyStoreSendNoop ) // flushableServer is an extension of storepb.Store_SeriesServer with a Flush method. @@ -34,6 +35,8 @@ func newFlushableServer( return &resortingServer{Store_SeriesServer: upstream} case sortingStrategyNone: return &passthroughServer{Store_SeriesServer: upstream} + case sortingStrategyStoreSendNoop: + return &resortingServer{Store_SeriesServer: upstream, notSend: true} default: // should not happen. panic("unexpected sorting strategy") @@ -53,11 +56,15 @@ func (p *passthroughServer) Flush() error { return nil } // Data is resorted and sent to an upstream server upon calling Flush. type resortingServer struct { storepb.Store_SeriesServer - series []*storepb.Series + series []*storepb.Series + notSend bool } func (r *resortingServer) Send(response *storepb.SeriesResponse) error { if response.GetSeries() == nil { + if r.notSend { + return nil + } return r.Store_SeriesServer.Send(response) } @@ -74,6 +81,9 @@ func (r *resortingServer) Flush() error { labelpb.ZLabelsToPromLabels(b.Labels), ) }) + if r.notSend { + return nil + } for _, response := range r.series { if err := r.Store_SeriesServer.Send(storepb.NewSeriesResponse(response)); err != nil { return err diff --git a/pkg/store/io.go b/pkg/store/io.go index 657f3134d2..f2356e6759 100644 --- a/pkg/store/io.go +++ b/pkg/store/io.go @@ -109,7 +109,7 @@ func readByteRanges(src io.Reader, dst []byte, byteRanges byteRanges) ([]byte, e if err != nil { // We get an ErrUnexpectedEOF if EOF is reached before we fill the slice. // Due to how the reading logic works in the bucket store, we may try to overread - // the last byte range so, if the error occurrs on the last one, we consider it legit. + // the last byte range so, if the error occurs on the last one, we consider it legit. if err == io.ErrUnexpectedEOF && idx == len(byteRanges)-1 { return dst, nil } diff --git a/pkg/store/io_test.go b/pkg/store/io_test.go index af8e863be6..0303ec5006 100644 --- a/pkg/store/io_test.go +++ b/pkg/store/io_test.go @@ -14,6 +14,8 @@ import ( ) func TestByteRanges_contiguous(t *testing.T) { + t.Parallel() + tests := []struct { ranges byteRanges expected bool @@ -42,6 +44,8 @@ func TestByteRanges_contiguous(t *testing.T) { } func TestReadByteRanges(t *testing.T) { + t.Parallel() + tests := map[string]struct { src []byte ranges byteRanges diff --git a/pkg/store/lazy_postings.go b/pkg/store/lazy_postings.go index 9469be9b47..f8363ab477 100644 --- a/pkg/store/lazy_postings.go +++ b/pkg/store/lazy_postings.go @@ -8,6 +8,7 @@ import ( "math" "strings" + "github.com/go-kit/log/level" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/prometheus/model/labels" @@ -54,14 +55,18 @@ func optimizePostingsFetchByDownloadedBytes(r *bucketIndexReader, postingGroups return nil, false, errors.Wrapf(err, "postings offsets for %s", pg.name) } - for _, r := range rngs { - if r == indexheader.NotFoundRange { + for _, rng := range rngs { + if rng == indexheader.NotFoundRange { continue } + if rng.End <= rng.Start { + level.Error(r.logger).Log("msg", "invalid index range, fallback to non lazy posting optimization") + return postingGroups, false, nil + } // Each range starts from the #entries field which is 4 bytes. // Need to subtract it when calculating number of postings. // https://github.com/prometheus/prometheus/blob/v2.46.0/tsdb/docs/format/index.md. - pg.cardinality += (r.End - r.Start - 4) / 4 + pg.cardinality += (rng.End - rng.Start - 4) / 4 } // If the posting group adds keys, 0 cardinality means the posting doesn't exist. // If the posting group removes keys, no posting ranges found is fine as it is a noop. @@ -303,8 +308,8 @@ func fetchAndExpandPostingGroups(ctx context.Context, r *bucketIndexReader, post result := index.Without(index.Intersect(groupAdds...), index.Merge(ctx, groupRemovals...)) - if ctx.Err() != nil { - return nil, nil, ctx.Err() + if err := ctx.Err(); err != nil { + return nil, nil, err } ps, err := ExpandPostingsWithContext(ctx, result) if err != nil { diff --git a/pkg/store/lazy_postings_test.go b/pkg/store/lazy_postings_test.go index 08e30b6d5b..06157affe0 100644 --- a/pkg/store/lazy_postings_test.go +++ b/pkg/store/lazy_postings_test.go @@ -25,6 +25,8 @@ import ( ) func TestKeysToFetchFromPostingGroups(t *testing.T) { + t.Parallel() + for _, tc := range []struct { name string pgs []*postingGroup @@ -253,13 +255,15 @@ func (h *mockIndexHeaderReader) LabelValues(name string) ([]string, error) { ret func (h *mockIndexHeaderReader) LabelNames() ([]string, error) { return nil, nil } func TestOptimizePostingsFetchByDownloadedBytes(t *testing.T) { + t.Parallel() + ctx := context.Background() - logger := log.NewNopLogger() dir := t.TempDir() bkt, err := filesystem.NewBucket(dir) testutil.Ok(t, err) defer func() { testutil.Ok(t, bkt.Close()) }() + logger := log.NewNopLogger() inputError := errors.New("random") blockID := ulid.MustNew(1, nil) meta := &metadata.Meta{ @@ -555,9 +559,9 @@ func TestOptimizePostingsFetchByDownloadedBytes(t *testing.T) { t.Run(tc.name, func(t *testing.T) { headerReader := &mockIndexHeaderReader{postings: tc.inputPostings, err: tc.inputError} registry := prometheus.NewRegistry() - block, err := newBucketBlock(ctx, logger, newBucketStoreMetrics(registry), meta, bkt, path.Join(dir, blockID.String()), nil, nil, headerReader, nil, nil, nil) + block, err := newBucketBlock(ctx, newBucketStoreMetrics(registry), meta, bkt, path.Join(dir, blockID.String()), nil, nil, headerReader, nil, nil, nil) testutil.Ok(t, err) - ir := newBucketIndexReader(block) + ir := newBucketIndexReader(block, logger) dummyCounter := promauto.With(registry).NewCounter(prometheus.CounterOpts{Name: "test"}) pgs, emptyPosting, err := optimizePostingsFetchByDownloadedBytes(ir, tc.postingGroups, tc.seriesMaxSize, tc.seriesMatchRatio, dummyCounter) if err != nil { diff --git a/pkg/store/limiter.go b/pkg/store/limiter.go index f564e11443..993330cc85 100644 --- a/pkg/store/limiter.go +++ b/pkg/store/limiter.go @@ -34,7 +34,7 @@ type BytesLimiter interface { // Reserve bytes out of the total amount of bytes enforced by the limiter. // Returns an error if the limit has been exceeded. This function must be // goroutine safe. - Reserve(num uint64) error + ReserveWithType(num uint64, dataType StoreDataType) error } // ChunksLimiterFactory is used to create a new ChunksLimiter. The factory is useful for @@ -64,6 +64,10 @@ func NewLimiter(limit uint64, ctr prometheus.Counter) *Limiter { // Reserve implements ChunksLimiter. func (l *Limiter) Reserve(num uint64) error { + return l.ReserveWithType(num, 0) +} + +func (l *Limiter) ReserveWithType(num uint64, _ StoreDataType) error { if l == nil { return nil } diff --git a/pkg/store/limiter_test.go b/pkg/store/limiter_test.go index 97b225e8e6..b713f0574c 100644 --- a/pkg/store/limiter_test.go +++ b/pkg/store/limiter_test.go @@ -5,6 +5,7 @@ package store import ( "context" + "io" "testing" "time" @@ -18,6 +19,8 @@ import ( ) func TestLimiter(t *testing.T) { + t.Parallel() + c := promauto.With(nil).NewCounter(prometheus.CounterOpts{}) l := NewLimiter(10, c) @@ -35,6 +38,8 @@ func TestLimiter(t *testing.T) { } func TestRateLimitedServer(t *testing.T) { + t.Parallel() + numSamples := 60 series := []*storepb.SeriesResponse{ storeSeriesResponse(t, labels.FromStrings("series", "1"), makeSamples(numSamples)), @@ -56,7 +61,7 @@ func TestRateLimitedServer(t *testing.T) { series: series, }, { - name: "series bellow limit", + name: "series below limit", limits: SeriesSelectLimits{ SeriesPerRequest: 3, SamplesPerRequest: 0, @@ -73,7 +78,7 @@ func TestRateLimitedServer(t *testing.T) { err: "failed to send series: limit 2 violated (got 3)", }, { - name: "chunks bellow limit", + name: "chunks below limit", limits: SeriesSelectLimits{ SeriesPerRequest: 0, SamplesPerRequest: uint64(3 * numSamples * MaxSamplesPerChunk), @@ -96,8 +101,19 @@ func TestRateLimitedServer(t *testing.T) { defer cancel() store := NewLimitedStoreServer(newStoreServerStub(test.series), prometheus.NewRegistry(), test.limits) - seriesServer := storepb.NewInProcessStream(ctx, 10) - err := store.Series(&storepb.SeriesRequest{}, seriesServer) + client := storepb.ServerAsClient(store) + seriesClient, err := client.Series(ctx, &storepb.SeriesRequest{}) + testutil.Ok(t, err) + for { + _, err = seriesClient.Recv() + if err == io.EOF { + err = nil + break + } + if err != nil { + break + } + } if test.err == "" { testutil.Ok(t, err) } else { diff --git a/pkg/store/local.go b/pkg/store/local.go index 4e88c0a7e3..cb80f8f8cb 100644 --- a/pkg/store/local.go +++ b/pkg/store/local.go @@ -8,7 +8,6 @@ import ( "bytes" "context" "io" - "math" "sort" "github.com/go-kit/log" @@ -33,8 +32,7 @@ type LocalStore struct { logger log.Logger extLabels labels.Labels - info *storepb.InfoResponse - c io.Closer + c io.Closer // TODO(bwplotka): This is very naive in-memory DB. We can support much larger files, by // indexing labels, symbolizing strings and get chunk refs only without storing protobufs in memory. @@ -67,14 +65,6 @@ func NewLocalStoreFromJSONMmappableFile( logger: logger, extLabels: extLabels, c: f, - info: &storepb.InfoResponse{ - LabelSets: []labelpb.ZLabelSet{ - {Labels: labelpb.ZLabelsFromPromLabels(extLabels)}, - }, - StoreType: component.ToProto(), - MinTime: math.MaxInt64, - MaxTime: math.MinInt64, - }, } // Do quick pass for in-mem index. @@ -101,13 +91,7 @@ func NewLocalStoreFromJSONMmappableFile( } chks := make([]int, 0, len(series.Chunks)) // Sort chunks in separate slice by MinTime for easier lookup. Find global max and min. - for ci, c := range series.Chunks { - if s.info.MinTime > c.MinTime { - s.info.MinTime = c.MinTime - } - if s.info.MaxTime < c.MaxTime { - s.info.MaxTime = c.MaxTime - } + for ci := range series.Chunks { chks = append(chks, ci) } @@ -121,7 +105,7 @@ func NewLocalStoreFromJSONMmappableFile( if err := skanner.Err(); err != nil { return nil, errors.Wrapf(err, "scanning file %s", path) } - level.Info(logger).Log("msg", "loading JSON file succeeded", "file", path, "info", s.info.String(), "series", len(s.series)) + level.Info(logger).Log("msg", "loading JSON file succeeded", "file", path, "series", len(s.series)) return s, nil } @@ -143,11 +127,6 @@ func ScanGRPCCurlProtoStreamMessages(data []byte, atEOF bool) (advance int, toke return len(delim), nil, nil } -// Info returns store information about the Prometheus instance. -func (s *LocalStore) Info(_ context.Context, _ *storepb.InfoRequest) (*storepb.InfoResponse, error) { - return s.info, nil -} - // Series returns all series for a requested time range and label matcher. The returned data may // exceed the requested time bounds. func (s *LocalStore) Series(r *storepb.SeriesRequest, srv storepb.Store_SeriesServer) error { diff --git a/pkg/store/postings_codec.go b/pkg/store/postings_codec.go index f1f89fbd44..e5e472b675 100644 --- a/pkg/store/postings_codec.go +++ b/pkg/store/postings_codec.go @@ -16,6 +16,7 @@ import ( "github.com/prometheus/prometheus/storage" "github.com/prometheus/prometheus/tsdb/encoding" "github.com/prometheus/prometheus/tsdb/index" + extsnappy "github.com/thanos-io/thanos/pkg/extgrpc/snappy" "github.com/thanos-io/thanos/pkg/pool" ) @@ -192,7 +193,7 @@ func maximumDecodedLenSnappyStreamed(in []byte) (int, error) { return maxDecodedLen, nil } -var decodedBufPool = pool.MustNewBucketedBytes(1024, 65536, 2, 0) +var decodedBufPool = pool.MustNewBucketedPool[byte](1024, 65536, 2, 0) func newStreamedDiffVarintPostings(input []byte, disablePooling bool) (closeablePostings, error) { // We can't use the regular s2.Reader because it assumes a stream. @@ -449,7 +450,7 @@ func diffVarintEncodeNoHeader(p index.Postings, length int) ([]byte, error) { } // Creating 15 buckets from 1k to 32mb. -var snappyDecodePool = pool.MustNewBucketedBytes(1024, 32*1024*1024, 2, 0) +var snappyDecodePool = pool.MustNewBucketedPool[byte](1024, 32*1024*1024, 2, 0) type closeablePostings interface { index.Postings diff --git a/pkg/store/postings_codec_test.go b/pkg/store/postings_codec_test.go index fd62359461..5b3dfe88ba 100644 --- a/pkg/store/postings_codec_test.go +++ b/pkg/store/postings_codec_test.go @@ -26,6 +26,8 @@ import ( ) func TestStreamedSnappyMaximumDecodedLen(t *testing.T) { + t.Parallel() + t.Run("compressed", func(t *testing.T) { b := make([]byte, 100) for i := 0; i < 100; i++ { @@ -70,6 +72,8 @@ func TestStreamedSnappyMaximumDecodedLen(t *testing.T) { } func TestDiffVarintCodec(t *testing.T) { + t.Parallel() + chunksDir := t.TempDir() headOpts := tsdb.DefaultHeadOptions() @@ -343,6 +347,8 @@ func FuzzSnappyStreamEncoding(f *testing.F) { } func TestRegressionIssue6545(t *testing.T) { + t.Parallel() + diffVarintPostings, err := os.ReadFile("6545postingsrepro") testutil.Ok(t, err) diff --git a/pkg/store/prometheus.go b/pkg/store/prometheus.go index 721e9ed51e..11d7f1ff77 100644 --- a/pkg/store/prometheus.go +++ b/pkg/store/prometheus.go @@ -24,6 +24,7 @@ import ( "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/storage/remote" "github.com/prometheus/prometheus/tsdb/chunkenc" @@ -109,31 +110,6 @@ func (p *PrometheusStore) labelCallsSupportMatchers() bool { return parseErr == nil && version.GTE(baseVer) } -// Info returns store information about the Prometheus instance. -// NOTE(bwplotka): MaxTime & MinTime are not accurate nor adjusted dynamically. -// This is fine for now, but might be needed in future. -func (p *PrometheusStore) Info(_ context.Context, _ *storepb.InfoRequest) (*storepb.InfoResponse, error) { - lset := p.externalLabelsFn() - mint, maxt := p.timestamps() - - res := &storepb.InfoResponse{ - Labels: labelpb.ZLabelsFromPromLabels(lset), - StoreType: p.component.ToProto(), - MinTime: mint, - MaxTime: maxt, - } - - // Until we deprecate the single labels in the reply, we just duplicate - // them here for migration/compatibility purposes. - res.LabelSets = []labelpb.ZLabelSet{} - if len(res.Labels) > 0 { - res.LabelSets = append(res.LabelSets, labelpb.ZLabelSet{ - Labels: res.Labels, - }) - } - return res, nil -} - func (p *PrometheusStore) getBuffer() *[]byte { b := p.buffers.Get() return b.(*[]byte) @@ -173,7 +149,7 @@ func (p *PrometheusStore) Series(r *storepb.SeriesRequest, seriesSrv storepb.Sto if r.SkipChunks { finalExtLset := rmLabels(extLset.Copy(), extLsetToRemove) - labelMaps, err := p.client.SeriesInGRPC(s.Context(), p.base, matchers, r.MinTime, r.MaxTime) + labelMaps, err := p.client.SeriesInGRPC(s.Context(), p.base, matchers, r.MinTime, r.MaxTime, int(r.Limit)) if err != nil { return err } @@ -320,7 +296,7 @@ func (p *PrometheusStore) handleStreamedPrometheusResponse( seriesStats := &storepb.SeriesStatsCounter{} // TODO(bwplotka): Put read limit as a flag. - stream := remote.NewChunkedReader(bodySizer, remote.DefaultChunkedReadLimit, *data) + stream := remote.NewChunkedReader(bodySizer, config.DefaultChunkedReadLimit, *data) hasher := hashPool.Get().(hash.Hash64) defer hashPool.Put(hasher) for { @@ -571,12 +547,12 @@ func (p *PrometheusStore) LabelNames(ctx context.Context, r *storepb.LabelNamesR var lbls []string if len(matchers) == 0 || p.labelCallsSupportMatchers() { - lbls, err = p.client.LabelNamesInGRPC(ctx, p.base, matchers, r.Start, r.End) + lbls, err = p.client.LabelNamesInGRPC(ctx, p.base, matchers, r.Start, r.End, int(r.Limit)) if err != nil { return nil, err } } else { - sers, err := p.client.SeriesInGRPC(ctx, p.base, matchers, r.Start, r.End) + sers, err := p.client.SeriesInGRPC(ctx, p.base, matchers, r.Start, r.End, int(r.Limit)) if err != nil { return nil, err } @@ -642,7 +618,7 @@ func (p *PrometheusStore) LabelValues(ctx context.Context, r *storepb.LabelValue if len(matchers) == 0 { return &storepb.LabelValuesResponse{Values: []string{val}}, nil } - sers, err = p.client.SeriesInGRPC(ctx, p.base, matchers, r.Start, r.End) + sers, err = p.client.SeriesInGRPC(ctx, p.base, matchers, r.Start, r.End, int(r.Limit)) if err != nil { return nil, err } @@ -653,12 +629,12 @@ func (p *PrometheusStore) LabelValues(ctx context.Context, r *storepb.LabelValue } if len(matchers) == 0 || p.labelCallsSupportMatchers() { - vals, err = p.client.LabelValuesInGRPC(ctx, p.base, r.Label, matchers, r.Start, r.End) + vals, err = p.client.LabelValuesInGRPC(ctx, p.base, r.Label, matchers, r.Start, r.End, int(r.Limit)) if err != nil { return nil, err } } else { - sers, err = p.client.SeriesInGRPC(ctx, p.base, matchers, r.Start, r.End) + sers, err = p.client.SeriesInGRPC(ctx, p.base, matchers, r.Start, r.End, int(r.Limit)) if err != nil { return nil, err } diff --git a/pkg/store/prometheus_test.go b/pkg/store/prometheus_test.go index ac7060a04a..8fc6f1ef33 100644 --- a/pkg/store/prometheus_test.go +++ b/pkg/store/prometheus_test.go @@ -26,22 +26,23 @@ import ( "github.com/thanos-io/thanos/pkg/promclient" "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb" - "github.com/thanos-io/thanos/pkg/testutil/custom" "github.com/thanos-io/thanos/pkg/testutil/e2eutil" ) func TestPrometheusStore_Series_e2e(t *testing.T) { + t.Parallel() + testPrometheusStoreSeriesE2e(t, "") } // Regression test for https://github.com/thanos-io/thanos/issues/478. func TestPrometheusStore_Series_promOnPath_e2e(t *testing.T) { + t.Parallel() + testPrometheusStoreSeriesE2e(t, "/prometheus/sub/path") } func testPrometheusStoreSeriesE2e(t *testing.T, prefix string) { - defer custom.TolerantVerifyLeak(t) - p, err := e2eutil.NewPrometheusOnPath(prefix) testutil.Ok(t, err) defer func() { testutil.Ok(t, p.Stop()) }() @@ -170,7 +171,7 @@ func expandChunk(cit chunkenc.Iterator) (res []sample) { } func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() p, err := e2eutil.NewPrometheus() testutil.Ok(t, err) @@ -218,17 +219,6 @@ func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { }, expectedErr: errors.New("rpc error: code = InvalidArgument desc = no matchers specified (excluding external labels)"), }, - { - req: &storepb.SeriesRequest{ - SkipChunks: true, - Matchers: []storepb.LabelMatcher{ - {Type: storepb.LabelMatcher_RE, Name: "wrong-chars-in-label-name(hyphen)", Value: "adsf"}, - }, - MinTime: baseT - 10000000000, - MaxTime: baseT + 10000000000, - }, - expectedErr: errors.New("rpc error: code = InvalidArgument desc = expected 2xx response, got 400. Body: {\"status\":\"error\",\"errorType\":\"bad_data\",\"error\":\"invalid parameter \\\"match[]\\\": 1:7: parse error: unexpected character inside braces: '-'\"}"), - }, { req: &storepb.SeriesRequest{ SkipChunks: true, @@ -354,7 +344,7 @@ func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { } func TestPrometheusStore_Series_MatchExternalLabel(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() p, err := e2eutil.NewPrometheus() testutil.Ok(t, err) @@ -417,7 +407,7 @@ func TestPrometheusStore_Series_MatchExternalLabel(t *testing.T) { } func TestPrometheusStore_Series_ChunkHashCalculation_Integration(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() p, err := e2eutil.NewPrometheus() testutil.Ok(t, err) @@ -465,24 +455,3 @@ func TestPrometheusStore_Series_ChunkHashCalculation_Integration(t *testing.T) { testutil.Equals(t, want, got) } } - -func TestPrometheusStore_Info(t *testing.T) { - defer custom.TolerantVerifyLeak(t) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - proxy, err := NewPrometheusStore(nil, nil, promclient.NewDefaultClient(), nil, component.Sidecar, - func() labels.Labels { return labels.FromStrings("region", "eu-west") }, - func() (int64, int64) { return 123, 456 }, - nil) - testutil.Ok(t, err) - - resp, err := proxy.Info(ctx, &storepb.InfoRequest{}) - testutil.Ok(t, err) - - testutil.Equals(t, []labelpb.ZLabel{{Name: "region", Value: "eu-west"}}, resp.Labels) - testutil.Equals(t, storepb.StoreType_SIDECAR, resp.StoreType) - testutil.Equals(t, int64(123), resp.MinTime) - testutil.Equals(t, int64(456), resp.MaxTime) -} diff --git a/pkg/store/proxy.go b/pkg/store/proxy.go index 778879e117..68f498b93c 100644 --- a/pkg/store/proxy.go +++ b/pkg/store/proxy.go @@ -71,6 +71,9 @@ type Client interface { // Addr returns address of the store client. If second parameter is true, the client // represents a local client (server-as-client) and has no remote address. Addr() (addr string, isLocalClient bool) + + // Matches returns true if provided label matchers are allowed in the store. + Matches(matches []*labels.Matcher) bool } // ProxyStore implements the store API that proxies request to all given underlying stores. @@ -86,6 +89,7 @@ type ProxyStore struct { retrievalStrategy RetrievalStrategy debugLogging bool tsdbSelector *TSDBSelector + enableDedup bool } type proxyStoreMetrics struct { @@ -126,6 +130,13 @@ func WithTSDBSelector(selector *TSDBSelector) ProxyStoreOption { } } +// WithoutDedup disabled chunk deduplication when streaming series. +func WithoutDedup() ProxyStoreOption { + return func(s *ProxyStore) { + s.enableDedup = false + } +} + // NewProxyStore returns a new ProxyStore that uses the given clients that implements storeAPI to fan-in all series to the client. // Note that there is no deduplication support. Deduplication should be done on the highest level (just before PromQL). func NewProxyStore( @@ -156,6 +167,7 @@ func NewProxyStore( metrics: metrics, retrievalStrategy: retrievalStrategy, tsdbSelector: DefaultSelector, + enableDedup: true, } for _, option := range options { @@ -165,62 +177,6 @@ func NewProxyStore( return s } -// Info returns store information about the external labels this store have. -func (s *ProxyStore) Info(_ context.Context, _ *storepb.InfoRequest) (*storepb.InfoResponse, error) { - res := &storepb.InfoResponse{ - StoreType: s.component.ToProto(), - Labels: labelpb.ZLabelsFromPromLabels(s.selectorLabels), - } - - minTime := int64(math.MaxInt64) - maxTime := int64(0) - stores := s.stores() - - // Edge case: we have no data if there are no stores. - if len(stores) == 0 { - res.MaxTime = 0 - res.MinTime = 0 - - return res, nil - } - - for _, s := range stores { - mint, maxt := s.TimeRange() - if mint < minTime { - minTime = mint - } - if maxt > maxTime { - maxTime = maxt - } - } - - res.MaxTime = maxTime - res.MinTime = minTime - - labelSets := make(map[uint64]labelpb.ZLabelSet, len(stores)) - for _, st := range stores { - for _, lset := range st.LabelSets() { - mergedLabelSet := labelpb.ExtendSortedLabels(lset, s.selectorLabels) - labelSets[mergedLabelSet.Hash()] = labelpb.ZLabelSet{Labels: labelpb.ZLabelsFromPromLabels(mergedLabelSet)} - } - } - - res.LabelSets = make([]labelpb.ZLabelSet, 0, len(labelSets)) - for _, v := range labelSets { - res.LabelSets = append(res.LabelSets, v) - } - - // We always want to enforce announcing the subset of data that - // selector-labels represents. If no label-sets are announced by the - // store-proxy's discovered stores, then we still want to enforce - // announcing this subset by announcing the selector as the label-set. - if len(res.LabelSets) == 0 && len(res.Labels) > 0 { - res.LabelSets = append(res.LabelSets, labelpb.ZLabelSet{Labels: res.Labels}) - } - - return res, nil -} - func (s *ProxyStore) LabelSet() []labelpb.ZLabelSet { stores := s.stores() if len(stores) == 0 { @@ -286,7 +242,7 @@ func (s *ProxyStore) TSDBInfos() []infopb.TSDBInfo { func (s *ProxyStore) Series(originalRequest *storepb.SeriesRequest, srv storepb.Store_SeriesServer) error { // TODO(bwplotka): This should be part of request logger, otherwise it does not make much sense. Also, could be - // tiggered by tracing span to reduce cognitive load. + // triggered by tracing span to reduce cognitive load. reqLogger := log.With(s.logger, "component", "proxy") if s.debugLogging { reqLogger = log.With(reqLogger, "request", originalRequest.String()) @@ -299,25 +255,10 @@ func (s *ProxyStore) Series(originalRequest *storepb.SeriesRequest, srv storepb. if !match { return nil } + if len(matchers) == 0 { return status.Error(codes.InvalidArgument, errors.New("no matchers specified (excluding selector labels)").Error()) } - storeMatchers, _ := storepb.PromMatchersToMatchers(matchers...) // Error would be returned by matchesExternalLabels, so skip check. - - storeDebugMsgs := []string{} - r := &storepb.SeriesRequest{ - MinTime: originalRequest.MinTime, - MaxTime: originalRequest.MaxTime, - Matchers: storeMatchers, - Aggregates: originalRequest.Aggregates, - MaxResolutionWindow: originalRequest.MaxResolutionWindow, - SkipChunks: originalRequest.SkipChunks, - QueryHints: originalRequest.QueryHints, - PartialResponseDisabled: originalRequest.PartialResponseDisabled, - PartialResponseStrategy: originalRequest.PartialResponseStrategy, - ShardInfo: originalRequest.ShardInfo, - WithoutReplicaLabels: originalRequest.WithoutReplicaLabels, - } // We may arrive here either via the promql engine // or as a result of a grpc call in layered queries @@ -332,37 +273,30 @@ func (s *ProxyStore) Series(originalRequest *storepb.SeriesRequest, srv storepb. ctx = metadata.AppendToOutgoingContext(ctx, tenancy.DefaultTenantHeader, tenant) level.Debug(s.logger).Log("msg", "Tenant info in Series()", "tenant", tenant) - var ( - stores []Client - storeLabelSets []labels.Labels - ) - for _, st := range s.stores() { - // We might be able to skip the store if its meta information indicates it cannot have series matching our query. - if ok, reason := storeMatches(ctx, st, s.debugLogging, originalRequest.MinTime, originalRequest.MaxTime, matchers...); !ok { - if s.debugLogging { - storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s filtered out due to: %v", st, reason)) - } - continue - } - matches, extraMatchers := s.tsdbSelector.MatchLabelSets(st.LabelSets()...) - if !matches { - if s.debugLogging { - storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s filtered out due to: %v", st, "tsdb selector")) - } - continue - } - storeLabelSets = append(storeLabelSets, extraMatchers...) - - stores = append(stores, st) - } + stores, storeLabelSets, storeDebugMsgs := s.matchingStores(ctx, originalRequest.MinTime, originalRequest.MaxTime, matchers) if len(stores) == 0 { level.Debug(reqLogger).Log("err", ErrorNoStoresMatched, "stores", strings.Join(storeDebugMsgs, ";")) return nil } + + storeMatchers, _ := storepb.PromMatchersToMatchers(matchers...) // Error would be returned by matchesExternalLabels, so skip check. + r := &storepb.SeriesRequest{ + MinTime: originalRequest.MinTime, + MaxTime: originalRequest.MaxTime, + Limit: originalRequest.Limit, + Matchers: append(storeMatchers, MatchersForLabelSets(storeLabelSets)...), + Aggregates: originalRequest.Aggregates, + MaxResolutionWindow: originalRequest.MaxResolutionWindow, + SkipChunks: originalRequest.SkipChunks, + QueryHints: originalRequest.QueryHints, + PartialResponseDisabled: originalRequest.PartialResponseDisabled, + PartialResponseStrategy: originalRequest.PartialResponseStrategy, + ShardInfo: originalRequest.ShardInfo, + WithoutReplicaLabels: originalRequest.WithoutReplicaLabels, + } r.Matchers = append(r.Matchers, MatchersForLabelSets(storeLabelSets)...) storeResponses := make([]respSet, 0, len(stores)) - for _, st := range stores { st := st if s.debugLogging { @@ -389,8 +323,17 @@ func (s *ProxyStore) Series(originalRequest *storepb.SeriesRequest, srv storepb. level.Debug(reqLogger).Log("msg", "Series: started fanout streams", "status", strings.Join(storeDebugMsgs, ";")) - respHeap := NewResponseDeduplicator(NewProxyResponseLoserTree(storeResponses...)) + var respHeap seriesStream = NewProxyResponseLoserTree(storeResponses...) + if s.enableDedup { + respHeap = NewResponseDeduplicator(respHeap) + } + + i := 0 for respHeap.Next() { + i++ + if r.Limit > 0 && i > int(r.Limit) { + break + } resp := respHeap.At() if resp.GetWarning() != "" && (r.PartialResponseDisabled || r.PartialResponseStrategy == storepb.PartialResponseStrategy_ABORT) { @@ -398,6 +341,7 @@ func (s *ProxyStore) Series(originalRequest *storepb.SeriesRequest, srv storepb. } if err := srv.Send(resp); err != nil { + level.Error(reqLogger).Log("msg", "failed to stream response", "error", err) return status.Error(codes.Unknown, errors.Wrap(err, "send series response").Error()) } } @@ -405,134 +349,68 @@ func (s *ProxyStore) Series(originalRequest *storepb.SeriesRequest, srv storepb. return nil } -// storeMatches returns boolean if the given store may hold data for the given label matchers, time ranges and debug store matches gathered from context. -func storeMatches(ctx context.Context, s Client, debugLogging bool, mint, maxt int64, matchers ...*labels.Matcher) (ok bool, reason string) { - var storeDebugMatcher [][]*labels.Matcher - if ctxVal := ctx.Value(StoreMatcherKey); ctxVal != nil { - if value, ok := ctxVal.([][]*labels.Matcher); ok { - storeDebugMatcher = value - } - } - - storeMinTime, storeMaxTime := s.TimeRange() - if mint > storeMaxTime || maxt < storeMinTime { - if debugLogging { - reason = fmt.Sprintf("does not have data within this time period: [%v,%v]. Store time ranges: [%v,%v]", mint, maxt, storeMinTime, storeMaxTime) - } - return false, reason - } - - if ok, reason := storeMatchDebugMetadata(s, storeDebugMatcher); !ok { - return false, reason - } - - extLset := s.LabelSets() - if !labelSetsMatch(matchers, extLset...) { - if debugLogging { - reason = fmt.Sprintf("external labels %v does not match request label matchers: %v", extLset, matchers) - } - return false, reason - } - return true, "" -} - -// storeMatchDebugMetadata return true if the store's address match the storeDebugMatchers. -func storeMatchDebugMetadata(s Client, storeDebugMatchers [][]*labels.Matcher) (ok bool, reason string) { - if len(storeDebugMatchers) == 0 { - return true, "" - } - - addr, isLocal := s.Addr() - if isLocal { - return false, "the store is not remote, cannot match __address__" +// LabelNames returns all known label names. +func (s *ProxyStore) LabelNames(ctx context.Context, originalRequest *storepb.LabelNamesRequest) (*storepb.LabelNamesResponse, error) { + // TODO(bwplotka): This should be part of request logger, otherwise it does not make much sense. Also, could be + // triggered by tracing span to reduce cognitive load. + reqLogger := log.With(s.logger, "component", "proxy") + if s.debugLogging { + reqLogger = log.With(reqLogger, "request", originalRequest.String()) } - - match := false - for _, sm := range storeDebugMatchers { - match = match || labelSetsMatch(sm, labels.FromStrings("__address__", addr)) + match, matchers, err := matchesExternalLabels(originalRequest.Matchers, s.selectorLabels) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) } if !match { - return false, fmt.Sprintf("__address__ %v does not match debug store metadata matchers: %v", addr, storeDebugMatchers) - } - return true, "" -} - -// labelSetsMatch returns false if all label-set do not match the matchers (aka: OR is between all label-sets). -func labelSetsMatch(matchers []*labels.Matcher, lset ...labels.Labels) bool { - if len(lset) == 0 { - return true - } - - for _, ls := range lset { - notMatched := false - for _, m := range matchers { - if lv := ls.Get(m.Name); ls.Has(m.Name) && !m.Matches(lv) { - notMatched = true - break - } - } - if !notMatched { - return true - } + return &storepb.LabelNamesResponse{}, nil } - return false -} - -// LabelNames returns all known label names. -func (s *ProxyStore) LabelNames(ctx context.Context, r *storepb.LabelNamesRequest) ( - *storepb.LabelNamesResponse, error, -) { - var ( - warnings []string - names [][]string - mtx sync.Mutex - g, gctx = errgroup.WithContext(ctx) - storeDebugMsgs []string - ) // We may arrive here either via the promql engine // or as a result of a grpc call in layered queries - tenant, foundTenant := tenancy.GetTenantFromGRPCMetadata(gctx) + tenant, foundTenant := tenancy.GetTenantFromGRPCMetadata(ctx) if !foundTenant { - level.Debug(s.logger).Log("msg", "using tenant from context instead of metadata") - if gctx.Value(tenancy.TenantKey) != nil { - tenant = gctx.Value(tenancy.TenantKey).(string) + level.Debug(reqLogger).Log("msg", "using tenant from context instead of metadata") + if ctx.Value(tenancy.TenantKey) != nil { + tenant = ctx.Value(tenancy.TenantKey).(string) } } - gctx = metadata.AppendToOutgoingContext(gctx, tenancy.DefaultTenantHeader, tenant) + ctx = metadata.AppendToOutgoingContext(ctx, tenancy.DefaultTenantHeader, tenant) level.Debug(s.logger).Log("msg", "Tenant info in LabelNames()", "tenant", tenant) - for _, st := range s.stores() { - st := st - - // We might be able to skip the store if its meta information indicates it cannot have series matching our query. - if ok, reason := storeMatches(gctx, st, s.debugLogging, r.Start, r.End); !ok { - if s.debugLogging { - storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s filtered out due to: %v", st, reason)) - } - continue - } - matches, extraMatchers := s.tsdbSelector.MatchLabelSets(st.LabelSets()...) - if !matches { - if s.debugLogging { - storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s filtered out due to: %v", st, "tsdb selector")) - } - continue - } + stores, storeLabelSets, storeDebugMsgs := s.matchingStores(ctx, originalRequest.Start, originalRequest.End, matchers) + if len(stores) == 0 { + level.Debug(reqLogger).Log("err", ErrorNoStoresMatched, "stores", strings.Join(storeDebugMsgs, ";")) + return &storepb.LabelNamesResponse{}, nil + } + storeMatchers, _ := storepb.PromMatchersToMatchers(matchers...) // Error would be returned by matchesExternalLabels, so skip check. + r := &storepb.LabelNamesRequest{ + PartialResponseDisabled: originalRequest.PartialResponseDisabled, + Start: originalRequest.Start, + End: originalRequest.End, + Matchers: append(storeMatchers, MatchersForLabelSets(storeLabelSets)...), + WithoutReplicaLabels: originalRequest.WithoutReplicaLabels, + Hints: originalRequest.Hints, + } - if s.debugLogging { - storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s queried", st)) - } + var ( + warnings []string + names [][]string + mtx sync.Mutex + g, gctx = errgroup.WithContext(ctx) + ) + for _, st := range stores { + st := st + storeID, storeAddr, isLocalStore := storeInfo(st) g.Go(func() error { - resp, err := st.LabelNames(gctx, &storepb.LabelNamesRequest{ - PartialResponseDisabled: r.PartialResponseDisabled, - Start: r.Start, - End: r.End, - Matchers: append(r.Matchers, MatchersForLabelSets(extraMatchers)...), - WithoutReplicaLabels: r.WithoutReplicaLabels, + span, spanCtx := tracing.StartSpan(gctx, "proxy.label_names", tracing.Tags{ + "store.id": storeID, + "store.addr": storeAddr, + "store.is_local": isLocalStore, }) + defer span.Finish() + resp, err := st.LabelNames(spanCtx, r) if err != nil { err = errors.Wrapf(err, "fetch label names from store %s", st) if r.PartialResponseDisabled { @@ -553,73 +431,82 @@ func (s *ProxyStore) LabelNames(ctx context.Context, r *storepb.LabelNamesReques return nil }) } + level.Debug(reqLogger).Log("msg", "LabelNames: started fanout streams", "status", strings.Join(storeDebugMsgs, ";")) if err := g.Wait(); err != nil { return nil, err } - level.Debug(s.logger).Log("msg", strings.Join(storeDebugMsgs, ";")) + result := strutil.MergeUnsortedSlices(int(originalRequest.Limit), names...) + return &storepb.LabelNamesResponse{ - Names: strutil.MergeUnsortedSlices(names...), + Names: result, Warnings: warnings, }, nil } // LabelValues returns all known label values for a given label name. -func (s *ProxyStore) LabelValues(ctx context.Context, r *storepb.LabelValuesRequest) ( +func (s *ProxyStore) LabelValues(ctx context.Context, originalRequest *storepb.LabelValuesRequest) ( *storepb.LabelValuesResponse, error, ) { - var ( - warnings []string - all [][]string - mtx sync.Mutex - g, gctx = errgroup.WithContext(ctx) - storeDebugMsgs []string - ) - if r.Label == "" { + // TODO(bwplotka): This should be part of request logger, otherwise it does not make much sense. Also, could be + // triggered by tracing span to reduce cognitive load. + reqLogger := log.With(s.logger, "component", "proxy") + if s.debugLogging { + reqLogger = log.With(reqLogger, "request", originalRequest.String()) + } + + if originalRequest.Label == "" { return nil, status.Error(codes.InvalidArgument, "label name parameter cannot be empty") } + match, matchers, err := matchesExternalLabels(originalRequest.Matchers, s.selectorLabels) + if err != nil { + return nil, status.Error(codes.InvalidArgument, err.Error()) + } + if !match { + return &storepb.LabelValuesResponse{}, nil + } + // We may arrive here either via the promql engine // or as a result of a grpc call in layered queries - tenant, foundTenant := tenancy.GetTenantFromGRPCMetadata(gctx) + tenant, foundTenant := tenancy.GetTenantFromGRPCMetadata(ctx) if !foundTenant { - level.Debug(s.logger).Log("msg", "using tenant from context instead of metadata") - if gctx.Value(tenancy.TenantKey) != nil { - tenant = gctx.Value(tenancy.TenantKey).(string) + level.Debug(reqLogger).Log("msg", "using tenant from context instead of metadata") + if ctx.Value(tenancy.TenantKey) != nil { + tenant = ctx.Value(tenancy.TenantKey).(string) } } - gctx = metadata.AppendToOutgoingContext(gctx, tenancy.DefaultTenantHeader, tenant) - level.Debug(s.logger).Log("msg", "Tenant info in LabelValues()", "tenant", tenant) - - for _, st := range s.stores() { - st := st + ctx = metadata.AppendToOutgoingContext(ctx, tenancy.DefaultTenantHeader, tenant) + level.Debug(reqLogger).Log("msg", "Tenant info in LabelValues()", "tenant", tenant) - storeAddr, isLocalStore := st.Addr() - storeID := labelpb.PromLabelSetsToString(st.LabelSets()) - if storeID == "" { - storeID = "Store Gateway" - } + stores, storeLabelSets, storeDebugMsgs := s.matchingStores(ctx, originalRequest.Start, originalRequest.End, matchers) + if len(stores) == 0 { + level.Debug(reqLogger).Log("err", ErrorNoStoresMatched, "stores", strings.Join(storeDebugMsgs, ";")) + return &storepb.LabelValuesResponse{}, nil + } + storeMatchers, _ := storepb.PromMatchersToMatchers(matchers...) // Error would be returned by matchesExternalLabels, so skip check. + r := &storepb.LabelValuesRequest{ + Label: originalRequest.Label, + PartialResponseDisabled: originalRequest.PartialResponseDisabled, + Start: originalRequest.Start, + End: originalRequest.End, + Matchers: append(storeMatchers, MatchersForLabelSets(storeLabelSets)...), + WithoutReplicaLabels: originalRequest.WithoutReplicaLabels, + Limit: originalRequest.Limit, + } - // We might be able to skip the store if its meta information indicates it cannot have series matching our query. - if ok, reason := storeMatches(gctx, st, s.debugLogging, r.Start, r.End); !ok { - if s.debugLogging { - storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s filtered out due to: %v", st, reason)) - } - continue - } - matches, extraMatchers := s.tsdbSelector.MatchLabelSets(st.LabelSets()...) - if !matches { - if s.debugLogging { - storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s filtered out due to: %v", st, "tsdb selector")) - } - continue - } - if s.debugLogging { - storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s queried", st)) - } + var ( + warnings []string + all [][]string + mtx sync.Mutex + g, gctx = errgroup.WithContext(ctx) + ) + for _, st := range stores { + st := st + storeID, storeAddr, isLocalStore := storeInfo(st) g.Go(func() error { span, spanCtx := tracing.StartSpan(gctx, "proxy.label_values", tracing.Tags{ "store.id": storeID, @@ -628,23 +515,15 @@ func (s *ProxyStore) LabelValues(ctx context.Context, r *storepb.LabelValuesRequ }) defer span.Finish() - resp, err := st.LabelValues(spanCtx, &storepb.LabelValuesRequest{ - Label: r.Label, - PartialResponseDisabled: r.PartialResponseDisabled, - Start: r.Start, - End: r.End, - Matchers: append(r.Matchers, MatchersForLabelSets(extraMatchers)...), - WithoutReplicaLabels: r.WithoutReplicaLabels, - }) + resp, err := st.LabelValues(spanCtx, r) if err != nil { - msg := "fetch label values from store %s" - err = errors.Wrapf(err, msg, st) + err = errors.Wrapf(err, "fetch label values from store %s", st) if r.PartialResponseDisabled { return err } mtx.Lock() - warnings = append(warnings, errors.Wrapf(err, msg, st).Error()) + warnings = append(warnings, err.Error()) mtx.Unlock() return nil } @@ -657,14 +536,143 @@ func (s *ProxyStore) LabelValues(ctx context.Context, r *storepb.LabelValuesRequ return nil }) } + level.Debug(reqLogger).Log("msg", "LabelValues: started fanout streams", "status", strings.Join(storeDebugMsgs, ";")) if err := g.Wait(); err != nil { return nil, err } - level.Debug(s.logger).Log("msg", strings.Join(storeDebugMsgs, ";")) + vals := strutil.MergeUnsortedSlices(int(originalRequest.Limit), all...) + return &storepb.LabelValuesResponse{ - Values: strutil.MergeUnsortedSlices(all...), + Values: vals, Warnings: warnings, }, nil } + +func storeInfo(st Client) (storeID string, storeAddr string, isLocalStore bool) { + storeAddr, isLocalStore = st.Addr() + storeID = labelpb.PromLabelSetsToString(st.LabelSets()) + if storeID == "" { + storeID = "Store Gateway" + } + return storeID, storeAddr, isLocalStore +} + +// TODO: consider moving the following functions into something like "pkg/pruneutils" since it is also used for exemplars. + +func (s *ProxyStore) matchingStores(ctx context.Context, minTime, maxTime int64, matchers []*labels.Matcher) ([]Client, []labels.Labels, []string) { + var ( + stores []Client + storeLabelSets []labels.Labels + storeDebugMsgs []string + ) + for _, st := range s.stores() { + // We might be able to skip the store if its meta information indicates it cannot have series matching our query. + if ok, reason := storeMatches(ctx, s.debugLogging, st, minTime, maxTime, matchers...); !ok { + if s.debugLogging { + storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s filtered out due to: %v", st, reason)) + } + continue + } + matches, extraMatchers := s.tsdbSelector.MatchLabelSets(st.LabelSets()...) + if !matches { + if s.debugLogging { + storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s filtered out due to: %v", st, "tsdb selector")) + } + continue + } + storeLabelSets = append(storeLabelSets, extraMatchers...) + + stores = append(stores, st) + if s.debugLogging { + storeDebugMsgs = append(storeDebugMsgs, fmt.Sprintf("Store %s queried", st)) + } + } + + return stores, storeLabelSets, storeDebugMsgs +} + +// storeMatches returns boolean if the given store may hold data for the given label matchers, time ranges and debug store matches gathered from context. +func storeMatches(ctx context.Context, debugLogging bool, s Client, mint, maxt int64, matchers ...*labels.Matcher) (ok bool, reason string) { + var storeDebugMatcher [][]*labels.Matcher + if ctxVal := ctx.Value(StoreMatcherKey); ctxVal != nil { + if value, ok := ctxVal.([][]*labels.Matcher); ok { + storeDebugMatcher = value + } + } + + storeMinTime, storeMaxTime := s.TimeRange() + if mint > storeMaxTime || maxt < storeMinTime { + const s string = "does not have data within this time period" + if debugLogging { + return false, fmt.Sprintf("%s: [%v,%v]. Store time ranges: [%v,%v]", s, mint, maxt, storeMinTime, storeMaxTime) + } + return false, s + } + + if ok, reason := storeMatchDebugMetadata(s, debugLogging, storeDebugMatcher); !ok { + return false, reason + } + + extLset := s.LabelSets() + if !LabelSetsMatch(matchers, extLset...) { + const s string = "external labels does not match request label matchers" + if debugLogging { + return false, fmt.Sprintf("external labels %v does not match request label matchers: %v", extLset, matchers) + } + return false, s + } + + if !s.Matches(matchers) { + return false, fmt.Sprintf("store does not match filter for matchers: %v", matchers) + } + + return true, "" +} + +// storeMatchDebugMetadata return true if the store's address match the storeDebugMatchers. +func storeMatchDebugMetadata(s Client, debugLogging bool, storeDebugMatchers [][]*labels.Matcher) (ok bool, reason string) { + if len(storeDebugMatchers) == 0 { + return true, "" + } + + addr, isLocal := s.Addr() + if isLocal { + return false, "the store is not remote, cannot match __address__" + } + + match := false + for _, sm := range storeDebugMatchers { + match = match || LabelSetsMatch(sm, labels.FromStrings("__address__", addr)) + } + if !match { + const s string = "__address__ does not match debug store metadata matchers" + if debugLogging { + return false, fmt.Sprintf("__address__ %v does not match debug store metadata matchers: %v", addr, storeDebugMatchers) + } + return false, s + } + return true, "" +} + +// LabelSetsMatch returns false if all label-set do not match the matchers (aka: OR is between all label-sets). +func LabelSetsMatch(matchers []*labels.Matcher, lset ...labels.Labels) bool { + if len(lset) == 0 { + return true + } + + for _, ls := range lset { + notMatched := false + for _, m := range matchers { + if lv := ls.Get(m.Name); ls.Has(m.Name) && !m.Matches(lv) { + notMatched = true + break + } + } + if !notMatched { + return true + } + } + return false +} diff --git a/pkg/store/proxy_merge.go b/pkg/store/proxy_merge.go index 62469b7959..4442cf8fdb 100644 --- a/pkg/store/proxy_merge.go +++ b/pkg/store/proxy_merge.go @@ -14,11 +14,11 @@ import ( "github.com/cespare/xxhash/v2" "github.com/go-kit/log" "github.com/go-kit/log/level" - grpc_opentracing "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tracing" "github.com/opentracing/opentracing-go" "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/prometheus/model/labels" + grpc_opentracing "github.com/thanos-io/thanos/pkg/tracing/tracing_middleware" "github.com/thanos-io/thanos/pkg/losertree" "github.com/thanos-io/thanos/pkg/store/labelpb" @@ -26,8 +26,13 @@ import ( "github.com/thanos-io/thanos/pkg/tracing" ) +type seriesStream interface { + Next() bool + At() *storepb.SeriesResponse +} + type responseDeduplicator struct { - h *losertree.Tree[*storepb.SeriesResponse, respSet] + h seriesStream bufferedSameSeries []*storepb.SeriesResponse @@ -36,20 +41,23 @@ type responseDeduplicator struct { prev *storepb.SeriesResponse ok bool + + chunkDedupMap map[uint64]storepb.AggrChunk } // NewResponseDeduplicator returns a wrapper around a loser tree that merges duplicated series messages into one. // It also deduplicates identical chunks identified by the same checksum from each series message. -func NewResponseDeduplicator(h *losertree.Tree[*storepb.SeriesResponse, respSet]) *responseDeduplicator { +func NewResponseDeduplicator(h seriesStream) *responseDeduplicator { ok := h.Next() var prev *storepb.SeriesResponse if ok { prev = h.At() } return &responseDeduplicator{ - h: h, - ok: ok, - prev: prev, + h: h, + ok: ok, + prev: prev, + chunkDedupMap: make(map[uint64]storepb.AggrChunk), } } @@ -73,7 +81,7 @@ func (d *responseDeduplicator) Next() bool { d.ok = d.h.Next() if !d.ok { if len(d.bufferedSameSeries) > 0 { - d.bufferedResp = append(d.bufferedResp, chainSeriesAndRemIdenticalChunks(d.bufferedSameSeries)) + d.bufferedResp = append(d.bufferedResp, d.chainSeriesAndRemIdenticalChunks(d.bufferedSameSeries)) } return len(d.bufferedResp) > 0 } @@ -101,15 +109,15 @@ func (d *responseDeduplicator) Next() bool { continue } - d.bufferedResp = append(d.bufferedResp, chainSeriesAndRemIdenticalChunks(d.bufferedSameSeries)) + d.bufferedResp = append(d.bufferedResp, d.chainSeriesAndRemIdenticalChunks(d.bufferedSameSeries)) d.prev = s return true } } -func chainSeriesAndRemIdenticalChunks(series []*storepb.SeriesResponse) *storepb.SeriesResponse { - chunkDedupMap := map[uint64]*storepb.AggrChunk{} +func (d *responseDeduplicator) chainSeriesAndRemIdenticalChunks(series []*storepb.SeriesResponse) *storepb.SeriesResponse { + clear(d.chunkDedupMap) for _, s := range series { for _, chk := range s.GetSeries().Chunks { @@ -124,9 +132,9 @@ func chainSeriesAndRemIdenticalChunks(series []*storepb.SeriesResponse) *storepb hash = xxhash.Sum64(field.Data) } - if _, ok := chunkDedupMap[hash]; !ok { + if _, ok := d.chunkDedupMap[hash]; !ok { chk := chk - chunkDedupMap[hash] = &chk + d.chunkDedupMap[hash] = chk break } } @@ -134,13 +142,13 @@ func chainSeriesAndRemIdenticalChunks(series []*storepb.SeriesResponse) *storepb } // If no chunks were requested. - if len(chunkDedupMap) == 0 { + if len(d.chunkDedupMap) == 0 { return series[0] } - finalChunks := make([]storepb.AggrChunk, 0, len(chunkDedupMap)) - for _, chk := range chunkDedupMap { - finalChunks = append(finalChunks, *chk) + finalChunks := make([]storepb.AggrChunk, 0, len(d.chunkDedupMap)) + for _, chk := range d.chunkDedupMap { + finalChunks = append(finalChunks, chk) } sort.Slice(finalChunks, func(i, j int) bool { @@ -211,6 +219,7 @@ func (l *lazyRespSet) StoreLabels() map[string]struct{} { type lazyRespSet struct { // Generic parameters. span opentracing.Span + cl storepb.Store_SeriesClient closeSeries context.CancelFunc storeName string storeLabelSets []labels.Labels @@ -310,6 +319,7 @@ func newLazyRespSet( frameTimeout: frameTimeout, storeName: storeName, storeLabelSets: storeLabelSets, + cl: cl, closeSeries: closeSeries, span: span, dataOrFinishEvent: dataAvailable, @@ -349,7 +359,6 @@ func newLazyRespSet( } resp, err := cl.Recv() - if err != nil { if err == io.EOF { l.bufferedResponsesMtx.Lock() @@ -362,10 +371,10 @@ func newLazyRespSet( var rerr error // If timer is already stopped if t != nil && !t.Stop() { - if errors.Is(err, context.Canceled) { - // The per-Recv timeout has been reached. - rerr = errors.Wrapf(err, "failed to receive any data in %s from %s", l.frameTimeout, st) + if t.C != nil { + <-t.C // Drain the channel if it was already stopped. } + rerr = errors.Wrapf(err, "failed to receive any data in %s from %s", l.frameTimeout, st) } else { rerr = errors.Wrapf(err, "receive series from %s", st) } @@ -439,26 +448,22 @@ func newAsyncRespSet( emptyStreamResponses prometheus.Counter, ) (respSet, error) { - var span opentracing.Span - var closeSeries context.CancelFunc - - storeAddr, isLocalStore := st.Addr() - storeID := labelpb.PromLabelSetsToString(st.LabelSets()) - if storeID == "" { - storeID = "Store Gateway" - } + var ( + span opentracing.Span + cancel context.CancelFunc + ) + storeID, storeAddr, isLocalStore := storeInfo(st) seriesCtx := grpc_opentracing.ClientAddContextTags(ctx, opentracing.Tags{ "target": storeAddr, }) - span, seriesCtx = tracing.StartSpan(seriesCtx, "proxy.series", tracing.Tags{ "store.id": storeID, "store.is_local": isLocalStore, "store.addr": storeAddr, }) - seriesCtx, closeSeries = context.WithCancel(seriesCtx) + seriesCtx, cancel = context.WithCancel(seriesCtx) shardMatcher := shardInfo.Matcher(buffers) @@ -473,7 +478,7 @@ func newAsyncRespSet( span.SetTag("err", err.Error()) span.Finish() - closeSeries() + cancel() return nil, err } @@ -496,7 +501,7 @@ func newAsyncRespSet( frameTimeout, st.String(), st.LabelSets(), - closeSeries, + cancel, cl, shardMatcher, applySharding, @@ -508,7 +513,7 @@ func newAsyncRespSet( frameTimeout, st.String(), st.LabelSets(), - closeSeries, + cancel, cl, shardMatcher, applySharding, @@ -529,6 +534,7 @@ func (l *lazyRespSet) Close() { l.dataOrFinishEvent.Signal() l.shardMatcher.Close() + _ = l.cl.CloseSend() } // eagerRespSet is a SeriesSet that blocks until all data is retrieved from @@ -538,6 +544,7 @@ type eagerRespSet struct { // Generic parameters. span opentracing.Span + cl storepb.Store_SeriesClient closeSeries context.CancelFunc frameTimeout time.Duration @@ -568,6 +575,7 @@ func newEagerRespSet( ) respSet { ret := &eagerRespSet{ span: span, + cl: cl, closeSeries: closeSeries, frameTimeout: frameTimeout, bufferedResponses: []*storepb.SeriesResponse{}, @@ -615,7 +623,6 @@ func newEagerRespSet( } resp, err := cl.Recv() - if err != nil { if err == io.EOF { return false @@ -624,11 +631,10 @@ func newEagerRespSet( var rerr error // If timer is already stopped if t != nil && !t.Stop() { - <-t.C // Drain the channel if it was already stopped. - if errors.Is(err, context.Canceled) { - // The per-Recv timeout has been reached. - rerr = errors.Wrapf(err, "failed to receive any data in %s from %s", l.frameTimeout, storeName) + if t.C != nil { + <-t.C // Drain the channel if it was already stopped. } + rerr = errors.Wrapf(err, "failed to receive any data in %s from %s", l.frameTimeout, storeName) } else { rerr = errors.Wrapf(err, "receive series from %s", storeName) } @@ -718,6 +724,7 @@ func (l *eagerRespSet) Close() { l.closeSeries() } l.shardMatcher.Close() + _ = l.cl.CloseSend() } func (l *eagerRespSet) At() *storepb.SeriesResponse { diff --git a/pkg/store/proxy_merge_test.go b/pkg/store/proxy_merge_test.go index f72ba4a4ef..387d5ff6a8 100644 --- a/pkg/store/proxy_merge_test.go +++ b/pkg/store/proxy_merge_test.go @@ -16,6 +16,8 @@ import ( ) func TestRmLabelsCornerCases(t *testing.T) { + t.Parallel() + testutil.Equals(t, rmLabels(labelsFromStrings("aa", "bb"), map[string]struct{}{ "aa": {}, }), labels.Labels{}) @@ -25,6 +27,8 @@ func TestRmLabelsCornerCases(t *testing.T) { } func TestProxyResponseTreeSort(t *testing.T) { + t.Parallel() + for _, tcase := range []struct { title string input []respSet @@ -35,6 +39,7 @@ func TestProxyResponseTreeSort(t *testing.T) { input: []respSet{ &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "c", "3")), @@ -43,6 +48,7 @@ func TestProxyResponseTreeSort(t *testing.T) { }, &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "c", "4", "e", "5")), @@ -62,6 +68,7 @@ func TestProxyResponseTreeSort(t *testing.T) { input: []respSet{ &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "b", "2", "c", "3")), @@ -71,6 +78,7 @@ func TestProxyResponseTreeSort(t *testing.T) { }, &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("d", "4", "e", "5")), @@ -91,6 +99,7 @@ func TestProxyResponseTreeSort(t *testing.T) { input: []respSet{ &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "b", "2", "ext2", "9")), @@ -100,6 +109,7 @@ func TestProxyResponseTreeSort(t *testing.T) { }, &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "b", "2", "ext1", "5", "ext2", "9")), @@ -120,6 +130,7 @@ func TestProxyResponseTreeSort(t *testing.T) { input: []respSet{ &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "b", "2", "c", "3")), @@ -129,6 +140,7 @@ func TestProxyResponseTreeSort(t *testing.T) { }, &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "b", "1", "c", "3")), @@ -149,6 +161,7 @@ func TestProxyResponseTreeSort(t *testing.T) { input: []respSet{ &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "b", "2", "ext2", "9")), @@ -158,6 +171,7 @@ func TestProxyResponseTreeSort(t *testing.T) { }, &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("a", "1", "b", "2", "ext1", "5", "ext2", "9")), @@ -178,6 +192,7 @@ func TestProxyResponseTreeSort(t *testing.T) { input: []respSet{ &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("cluster", "beam-platform", "instance", "10.70.13.3:15692", "prometheus", "telemetry/observe-prometheus", "receive", "true", "tenant_id", "default-tenant")), @@ -188,6 +203,7 @@ func TestProxyResponseTreeSort(t *testing.T) { }, &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(t, labelsFromStrings("cluster", "beam-platform", "instance", "10.70.13.3:15692", "prometheus", "telemetry/observe-prometheus", "receive", "true", "tenant_id", "default-tenant")), @@ -219,7 +235,15 @@ func TestProxyResponseTreeSort(t *testing.T) { } } +type nopClientSendCloser struct { + storepb.Store_SeriesClient +} + +func (c nopClientSendCloser) CloseSend() error { return nil } + func TestSortWithoutLabels(t *testing.T) { + t.Parallel() + for _, tcase := range []struct { input []*storepb.SeriesResponse exp []*storepb.SeriesResponse @@ -341,6 +365,7 @@ func BenchmarkKWayMerge(b *testing.B) { for j := 0; j < 1000; j++ { respSets = append(respSets, &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: []*storepb.SeriesResponse{ storeSeriesResponse(b, labelsFromStrings("a", "1", "b", fmt.Sprintf("replica-%d", j), "c", "3")), diff --git a/pkg/store/proxy_test.go b/pkg/store/proxy_test.go index c4571de976..46b4c6a53f 100644 --- a/pkg/store/proxy_test.go +++ b/pkg/store/proxy_test.go @@ -6,6 +6,9 @@ package store import ( "context" "fmt" + "strings" + + "github.com/pkg/errors" "math" "math/rand" @@ -19,15 +22,12 @@ import ( "github.com/go-kit/log" "github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/types" - "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/model/timestamp" "github.com/prometheus/prometheus/tsdb" "github.com/prometheus/prometheus/tsdb/chunkenc" "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" "github.com/efficientgo/core/testutil" @@ -37,7 +37,6 @@ import ( "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb" storetestutil "github.com/thanos-io/thanos/pkg/store/storepb/testutil" - "github.com/thanos-io/thanos/pkg/testutil/custom" ) type mockedSeriesServer struct { @@ -59,25 +58,34 @@ type mockedStartTimeDB struct { func (db *mockedStartTimeDB) StartTime() (int64, error) { return db.startTime, nil } -func TestProxyStore_Info(t *testing.T) { - defer custom.TolerantVerifyLeak(t) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() +func TestProxyStore_TSDBInfos(t *testing.T) { + t.Parallel() - q := NewProxyStore(nil, - nil, - func() []Client { return nil }, - component.Query, - labels.EmptyLabels(), 0*time.Second, EagerRetrieval, + stores := []Client{ + &storetestutil.TestClient{ + StoreTSDBInfos: nil, + }, + &storetestutil.TestClient{ + StoreTSDBInfos: []infopb.TSDBInfo{ + infopb.NewTSDBInfo(0, 10, []labelpb.ZLabel{{Name: "lbl", Value: "val1"}}), + }, + }, + &storetestutil.TestClient{ + StoreTSDBInfos: []infopb.TSDBInfo{ + infopb.NewTSDBInfo(0, 20, []labelpb.ZLabel{{Name: "lbl", Value: "val2"}}), + }, + }, + } + q := NewProxyStore(nil, nil, + func() []Client { return stores }, + component.Query, labels.EmptyLabels(), 0*time.Second, EagerRetrieval, ) - resp, err := q.Info(ctx, &storepb.InfoRequest{}) - testutil.Ok(t, err) - testutil.Equals(t, []labelpb.ZLabelSet(nil), resp.LabelSets) - testutil.Equals(t, storepb.StoreType_QUERY, resp.StoreType) - testutil.Equals(t, int64(0), resp.MinTime) - testutil.Equals(t, int64(0), resp.MaxTime) + expected := []infopb.TSDBInfo{ + infopb.NewTSDBInfo(0, 10, []labelpb.ZLabel{{Name: "lbl", Value: "val1"}}), + infopb.NewTSDBInfo(0, 20, []labelpb.ZLabel{{Name: "lbl", Value: "val2"}}), + } + testutil.Equals(t, expected, q.TSDBInfos()) } func TestProxyStore_TSDBInfos(t *testing.T) { @@ -109,7 +117,7 @@ func TestProxyStore_TSDBInfos(t *testing.T) { } func TestProxyStore_Series(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() for _, tc := range []struct { title string @@ -742,6 +750,46 @@ func TestProxyStore_Series(t *testing.T) { }, }, }, + { + title: "skip chunks with limit", + storeAPIs: []Client{ + &storetestutil.TestClient{ + StoreClient: &mockedStoreAPI{ + RespSeries: []*storepb.SeriesResponse{ + storeSeriesResponse(t, labels.FromStrings("a", "1")), + storeSeriesResponse(t, labels.FromStrings("a", "2")), + }, + }, + MinTime: 1, + MaxTime: 300, + }, + &storetestutil.TestClient{ + StoreClient: &mockedStoreAPI{ + RespSeries: []*storepb.SeriesResponse{ + storeSeriesResponse(t, labels.FromStrings("a", "3")), + storeSeriesResponse(t, labels.FromStrings("a", "4")), + }, + }, + MinTime: 1, + MaxTime: 300, + }, + }, + req: &storepb.SeriesRequest{ + MinTime: 1, + MaxTime: 300, + Matchers: []storepb.LabelMatcher{{Name: "a", Value: "[1-4]", Type: storepb.LabelMatcher_RE}}, + SkipChunks: true, + Limit: 2, + }, + expectedSeries: []rawSeries{ + { + lset: labels.FromStrings("a", "1"), + }, + { + lset: labels.FromStrings("a", "2"), + }, + }, + }, } { t.Run(tc.title, func(t *testing.T) { for _, replicaLabelSupport := range []bool{false, true} { @@ -788,13 +836,13 @@ func TestProxyStore_Series(t *testing.T) { } func TestProxyStore_SeriesSlowStores(t *testing.T) { + t.Parallel() + enable := os.Getenv("THANOS_ENABLE_STORE_READ_TIMEOUT_TESTS") if enable == "" { t.Skip("enable THANOS_ENABLE_STORE_READ_TIMEOUT_TESTS to run store-read-timeout tests") } - defer custom.TolerantVerifyLeak(t) - for _, tc := range []struct { title string storeAPIs []Client @@ -1331,7 +1379,7 @@ func TestProxyStore_SeriesSlowStores(t *testing.T) { } func TestProxyStore_Series_RequestParamsProxied(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() m := &mockedStoreAPI{ RespSeries: []*storepb.SeriesResponse{ @@ -1375,7 +1423,7 @@ func TestProxyStore_Series_RequestParamsProxied(t *testing.T) { } func TestProxyStore_Series_RegressionFillResponseChannel(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() var cls []Client for i := 0; i < 10; i++ { @@ -1431,7 +1479,7 @@ func TestProxyStore_Series_RegressionFillResponseChannel(t *testing.T) { } func TestProxyStore_LabelValues(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() m1 := &mockedStoreAPI{ RespLabelValues: &storepb.LabelValuesResponse{ @@ -1439,7 +1487,7 @@ func TestProxyStore_LabelValues(t *testing.T) { Warnings: []string{"warning"}, }, } - cls := []Client{ + storeApis := []Client{ &storetestutil.TestClient{StoreClient: m1}, &storetestutil.TestClient{StoreClient: &mockedStoreAPI{ RespLabelValues: &storepb.LabelValuesResponse{ @@ -1454,45 +1502,86 @@ func TestProxyStore_LabelValues(t *testing.T) { MaxTime: timestamp.FromTime(time.Now()), }, } - q := NewProxyStore(nil, - nil, - func() []Client { return cls }, - component.Query, - labels.EmptyLabels(), - 0*time.Second, EagerRetrieval, - ) - ctx := context.Background() - req := &storepb.LabelValuesRequest{ - Label: "a", - PartialResponseDisabled: true, - Start: timestamp.FromTime(minTime), - End: timestamp.FromTime(maxTime), - } - resp, err := q.LabelValues(ctx, req) - testutil.Ok(t, err) - testutil.Assert(t, proto.Equal(req, m1.LastLabelValuesReq), "request was not proxied properly to underlying storeAPI: %s vs %s", req, m1.LastLabelValuesReq) - - testutil.Equals(t, []string{"1", "2", "3", "4", "5", "6"}, resp.Values) - testutil.Equals(t, 1, len(resp.Warnings)) - - // Request outside the time range of the last store client. - req = &storepb.LabelValuesRequest{ - Label: "a", - PartialResponseDisabled: true, - Start: timestamp.FromTime(minTime), - End: timestamp.FromTime(time.Now().Add(-1 * time.Hour)), - } - resp, err = q.LabelValues(ctx, req) - testutil.Ok(t, err) - testutil.Assert(t, proto.Equal(req, m1.LastLabelValuesReq), "request was not proxied properly to underlying storeAPI: %s vs %s", req, m1.LastLabelValuesReq) + for _, tc := range []struct { + title string + storeAPIs []Client + + req *storepb.LabelValuesRequest + + expectedValues []string + expectedErr error + expectedWarningsLen int + }{ + { + title: "request all time range", + storeAPIs: storeApis, + req: &storepb.LabelValuesRequest{ + Label: "a", + PartialResponseDisabled: true, + Start: timestamp.FromTime(minTime), + End: timestamp.FromTime(maxTime), + }, + expectedValues: []string{"1", "2", "3", "4", "5", "6"}, + expectedWarningsLen: 1, + }, + { + title: "outside the time range of the last store client", + storeAPIs: storeApis, + req: &storepb.LabelValuesRequest{ + Label: "a", + PartialResponseDisabled: true, + Start: timestamp.FromTime(minTime), + End: timestamp.FromTime(time.Now().Add(-1 * time.Hour)), + }, + expectedValues: []string{"1", "2", "3", "4"}, + expectedWarningsLen: 1, + }, + { + title: "request all time range with limit", + storeAPIs: storeApis, + req: &storepb.LabelValuesRequest{ + Label: "a", + PartialResponseDisabled: true, + Start: timestamp.FromTime(minTime), + End: timestamp.FromTime(maxTime), + Limit: 2, + }, + expectedValues: []string{"1", "2"}, + expectedWarningsLen: 1, + }, + } { + if ok := t.Run(tc.title, func(t *testing.T) { + q := NewProxyStore( + nil, + nil, + func() []Client { return tc.storeAPIs }, + component.Query, + labels.EmptyLabels(), + 0*time.Second, EagerRetrieval, + ) - testutil.Equals(t, []string{"1", "2", "3", "4"}, resp.Values) - testutil.Equals(t, 1, len(resp.Warnings)) + ctx := context.Background() + + resp, err := q.LabelValues(ctx, tc.req) + if tc.expectedErr != nil { + testutil.NotOk(t, err) + testutil.Equals(t, tc.expectedErr.Error(), err.Error()) + return + } + testutil.Ok(t, err) + testutil.Assert(t, proto.Equal(tc.req, m1.LastLabelValuesReq), "request was not proxied properly to underlying storeAPI: %s vs %s", tc.req, m1.LastLabelValuesReq) + + testutil.Equals(t, tc.expectedValues, resp.Values) + testutil.Equals(t, tc.expectedWarningsLen, len(resp.Warnings), "got %v", resp.Warnings) + }); !ok { + return + } + } } func TestProxyStore_LabelNames(t *testing.T) { - defer custom.TolerantVerifyLeak(t) + t.Parallel() for _, tc := range []struct { title string @@ -1651,6 +1740,33 @@ func TestProxyStore_LabelNames(t *testing.T) { expectedNames: []string{"a", "b"}, expectedWarningsLen: 0, }, + { + title: "label_names partial response disabled with limit", + storeAPIs: []Client{ + &storetestutil.TestClient{ + StoreClient: &mockedStoreAPI{ + RespLabelNames: &storepb.LabelNamesResponse{ + Names: []string{"a", "b"}, + }, + }, + }, + &storetestutil.TestClient{ + StoreClient: &mockedStoreAPI{ + RespLabelNames: &storepb.LabelNamesResponse{ + Names: []string{"a", "c", "d"}, + }, + }, + }, + }, + req: &storepb.LabelNamesRequest{ + Start: timestamp.FromTime(minTime), + End: timestamp.FromTime(maxTime), + PartialResponseDisabled: true, + Limit: 2, + }, + expectedNames: []string{"a", "b"}, + expectedWarningsLen: 0, + }, } { if ok := t.Run(tc.title, func(t *testing.T) { q := NewProxyStore( @@ -1719,6 +1835,8 @@ func seriesEquals(t *testing.T, expected []rawSeries, got []storepb.Series) { } func TestStoreMatches(t *testing.T) { + t.Parallel() + for _, c := range []struct { s Client mint, maxt int64 @@ -1840,9 +1958,33 @@ func TestStoreMatches(t *testing.T) { maxt: 1, expectedMatch: true, }, + { + s: &storetestutil.TestClient{ExtLset: []labels.Labels{labels.FromStrings("a", "b")}}, + ms: []*labels.Matcher{ + labels.MustNewMatcher(labels.MatchEqual, "a", "b"), + labels.MustNewMatcher(labels.MatchEqual, labels.MetricName, "test_metric_name"), + }, + maxt: 1, + expectedMatch: true, + }, + { + s: &storetestutil.TestClient{ + ExtLset: []labels.Labels{ + labels.FromStrings("a", "b"), + }, + StoreFilterNotMatches: true, + }, + ms: []*labels.Matcher{ + labels.MustNewMatcher(labels.MatchEqual, "a", "b"), + labels.MustNewMatcher(labels.MatchEqual, labels.MetricName, "test_metric_name"), + }, + maxt: 1, + expectedMatch: false, + expectedReason: "store does not match filter for matchers: [a=\"b\" __name__=\"test_metric_name\"]", + }, } { t.Run("", func(t *testing.T) { - ok, reason := storeMatches(context.TODO(), c.s, true, c.mint, c.maxt, c.ms...) + ok, reason := storeMatches(context.TODO(), true, c.s, c.mint, c.maxt, c.ms...) testutil.Equals(t, c.expectedMatch, ok) testutil.Equals(t, c.expectedReason, reason) @@ -1913,10 +2055,6 @@ type mockedStoreAPI struct { injectedErrorIndex int } -func (s *mockedStoreAPI) Info(context.Context, *storepb.InfoRequest, ...grpc.CallOption) (*storepb.InfoResponse, error) { - return nil, status.Error(codes.Unimplemented, "not implemented") -} - func (s *mockedStoreAPI) Series(ctx context.Context, req *storepb.SeriesRequest, _ ...grpc.CallOption) (storepb.Store_SeriesClient, error) { s.LastSeriesReq = req return &storetestutil.StoreSeriesClient{InjectedErrorIndex: s.injectedErrorIndex, InjectedError: s.injectedError, Ctx: ctx, RespSet: s.RespSeries, RespDur: s.RespDuration, SlowSeriesIndex: s.SlowSeriesIndex}, s.RespError @@ -1961,6 +2099,8 @@ func storeSeriesResponse(t testing.TB, lset labels.Labels, smplChunks ...[]sampl } func TestProxySeries(t *testing.T) { + t.Parallel() + tb := testutil.NewTB(t) storetestutil.RunSeriesInterestingCases(tb, 200e3, 200e3, func(t testutil.TB, samplesPerSeries, series int) { benchProxySeries(t, samplesPerSeries, series) @@ -2036,9 +2176,12 @@ func benchProxySeries(t testutil.TB, totalSamples, totalSeries int) { for _, r := range m.RespSeries { allResps = append(allResps, r) - x := storepb.Series{Labels: r.GetSeries().Labels} + sr := r.GetSeries() + sr = proto.Clone(sr).(*storepb.Series) + + x := storepb.Series{Labels: sr.Labels} if x.String() == lastLabels.String() { - expected[len(expected)-1].Chunks = append(expected[len(expected)-1].Chunks, r.GetSeries().Chunks...) + expected[len(expected)-1].Chunks = append(expected[len(expected)-1].Chunks, sr.Chunks...) continue } lastLabels = x @@ -2103,88 +2246,148 @@ func benchProxySeries(t testutil.TB, totalSamples, totalSeries int) { } func TestProxyStore_NotLeakingOnPrematureFinish(t *testing.T) { - defer custom.TolerantVerifyLeak(t) - - clients := []Client{ - &storetestutil.TestClient{ - StoreClient: &mockedStoreAPI{ - RespSeries: []*storepb.SeriesResponse{ - // Ensure more than 10 (internal respCh channel). - storeSeriesResponse(t, labels.FromStrings("a", "a"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "b"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "c"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "d"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "e"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "f"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "g"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "h"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "i"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("a", "j"), []sample{{0, 0}, {2, 1}, {3, 2}}), - }, - }, - MinTime: math.MinInt64, - MaxTime: math.MaxInt64, - }, - &storetestutil.TestClient{ - StoreClient: &mockedStoreAPI{ - RespSeries: []*storepb.SeriesResponse{ - storeSeriesResponse(t, labels.FromStrings("b", "a"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "b"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "c"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "d"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "e"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "f"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "g"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "h"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "i"), []sample{{0, 0}, {2, 1}, {3, 2}}), - storeSeriesResponse(t, labels.FromStrings("b", "j"), []sample{{0, 0}, {2, 1}, {3, 2}}), - }, - }, - MinTime: math.MinInt64, - MaxTime: math.MaxInt64, - }, - } + t.Parallel() logger := log.NewNopLogger() - p := &ProxyStore{ - logger: logger, - stores: func() []Client { return clients }, - metrics: newProxyStoreMetrics(nil), - responseTimeout: 0, - retrievalStrategy: EagerRetrieval, - tsdbSelector: DefaultSelector, + + for _, respStrategy := range []RetrievalStrategy{EagerRetrieval, LazyRetrieval} { + t.Run(fmt.Sprintf("strategy=%v", respStrategy), func(t *testing.T) { + t.Run("failing send", func(t *testing.T) { + clients := []Client{ + &storetestutil.TestClient{ + StoreClient: &mockedStoreAPI{ + RespSeries: []*storepb.SeriesResponse{ + // Ensure more than 10 (internal respCh channel). + storeSeriesResponse(t, labels.FromStrings("a", "a"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "b"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "c"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "d"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "e"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "f"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "g"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "h"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "i"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("a", "j"), []sample{{0, 0}, {2, 1}, {3, 2}}), + }, + }, + MinTime: math.MinInt64, + MaxTime: math.MaxInt64, + }, + &storetestutil.TestClient{ + StoreClient: &mockedStoreAPI{ + RespSeries: []*storepb.SeriesResponse{ + storeSeriesResponse(t, labels.FromStrings("b", "a"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "b"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "c"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "d"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "e"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "f"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "g"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "h"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "i"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "j"), []sample{{0, 0}, {2, 1}, {3, 2}}), + }, + }, + MinTime: math.MinInt64, + MaxTime: math.MaxInt64, + }, + } + + p := &ProxyStore{ + logger: logger, + stores: func() []Client { return clients }, + metrics: newProxyStoreMetrics(nil), + responseTimeout: 50 * time.Millisecond, + retrievalStrategy: respStrategy, + tsdbSelector: DefaultSelector, + } + + ctx, cancel := context.WithCancel(context.Background()) + // We mimic failing series server, but practically context cancel will do the same. + testutil.NotOk(t, p.Series(&storepb.SeriesRequest{Matchers: []storepb.LabelMatcher{{}}, PartialResponseStrategy: storepb.PartialResponseStrategy_ABORT}, &mockedSeriesServer{ + ctx: ctx, + send: func(*storepb.SeriesResponse) error { + cancel() + return ctx.Err() + }, + })) + testutil.NotOk(t, ctx.Err()) + }) + + t.Run("client timeout", func(t *testing.T) { + clients := []Client{ + &storetestutil.TestClient{ + StoreClient: storepb.ServerAsClient(&storeServerStub{ + delay: 50 * time.Millisecond, + responses: []*storepb.SeriesResponse{ + storeSeriesResponse(t, labels.FromStrings("b", "a"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "b"), []sample{{0, 0}, {2, 1}, {3, 2}}), + storeSeriesResponse(t, labels.FromStrings("b", "c"), []sample{{0, 0}, {2, 1}, {3, 2}}), + }, + }), + MinTime: math.MinInt64, + MaxTime: math.MaxInt64, + }, + } + + p := &ProxyStore{ + logger: logger, + stores: func() []Client { return clients }, + metrics: newProxyStoreMetrics(nil), + responseTimeout: 50 * time.Millisecond, + retrievalStrategy: respStrategy, + tsdbSelector: DefaultSelector, + } + + ctx := context.Background() + err := p.Series(&storepb.SeriesRequest{Matchers: []storepb.LabelMatcher{{}}, PartialResponseStrategy: storepb.PartialResponseStrategy_ABORT}, &mockedSeriesServer{ + ctx: ctx, + send: func(*storepb.SeriesResponse) error { + return nil + }, + }) + + testutil.Assert(t, strings.Contains(err.Error(), context.Canceled.Error())) + }) + }) } +} - t.Run("failling send", func(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - // We mimic failing series server, but practically context cancel will do the same. - testutil.NotOk(t, p.Series(&storepb.SeriesRequest{Matchers: []storepb.LabelMatcher{{}}, PartialResponseStrategy: storepb.PartialResponseStrategy_ABORT}, &mockedSeriesServer{ - ctx: ctx, - send: func(*storepb.SeriesResponse) error { - cancel() - return ctx.Err() - }, - })) - testutil.NotOk(t, ctx.Err()) - }) +type storeServerStub struct { + storepb.StoreServer + + delay time.Duration + responses []*storepb.SeriesResponse +} + +func (m *storeServerStub) Series(_ *storepb.SeriesRequest, server storepb.Store_SeriesServer) error { + for _, r := range m.responses { + <-time.After(m.delay) + if err := server.Send(r); err != nil { + return err + } + } + return nil } func TestProxyStore_storeMatchMetadata(t *testing.T) { + t.Parallel() + c := storetestutil.TestClient{Name: "testaddr"} c.IsLocalStore = true - ok, reason := storeMatchDebugMetadata(c, [][]*labels.Matcher{{}}) + ok, reason := storeMatchDebugMetadata(c, true, [][]*labels.Matcher{{}}) testutil.Assert(t, !ok) testutil.Equals(t, "the store is not remote, cannot match __address__", reason) // Change client to remote. c.IsLocalStore = false - ok, reason = storeMatchDebugMetadata(c, [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchEqual, "__address__", "wrong")}}) + ok, reason = storeMatchDebugMetadata(c, true, [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchEqual, "__address__", "wrong")}}) testutil.Assert(t, !ok) testutil.Equals(t, "__address__ testaddr does not match debug store metadata matchers: [[__address__=\"wrong\"]]", reason) - ok, reason = storeMatchDebugMetadata(c, [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchEqual, "__address__", "testaddr")}}) + ok, reason = storeMatchDebugMetadata(c, true, [][]*labels.Matcher{{labels.MustNewMatcher(labels.MatchEqual, "__address__", "testaddr")}}) testutil.Assert(t, ok) testutil.Equals(t, "", reason) } @@ -2286,6 +2489,7 @@ func TestDedupRespHeap_Deduplication(t *testing.T) { h := NewResponseDeduplicator(NewProxyResponseLoserTree( &eagerRespSet{ closeSeries: func() {}, + cl: nopClientSendCloser{}, wg: &sync.WaitGroup{}, bufferedResponses: tcase.responses, }, diff --git a/pkg/store/recover_test.go b/pkg/store/recover_test.go index c33d337e85..c9e01ec7dc 100644 --- a/pkg/store/recover_test.go +++ b/pkg/store/recover_test.go @@ -5,6 +5,7 @@ package store import ( "context" + "io" "testing" "github.com/efficientgo/core/testutil" @@ -14,14 +15,24 @@ import ( ) func TestRecoverableServer(t *testing.T) { + t.Parallel() + logger := log.NewNopLogger() store := NewRecoverableStoreServer(logger, &panicStoreServer{}) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - srv := storepb.NewInProcessStream(ctx, 1) - - testutil.Ok(t, store.Series(&storepb.SeriesRequest{}, srv)) + client := storepb.ServerAsClient(store) + seriesClient, err := client.Series(ctx, &storepb.SeriesRequest{}) + testutil.Ok(t, err) + + for { + _, err := seriesClient.Recv() + if err == io.EOF { + break + } + testutil.Ok(t, err) + } } type panicStoreServer struct { diff --git a/pkg/store/storepb/custom.go b/pkg/store/storepb/custom.go index faed79bc7b..d5461a5947 100644 --- a/pkg/store/storepb/custom.go +++ b/pkg/store/storepb/custom.go @@ -329,7 +329,10 @@ func (m *Chunk) Compare(b *Chunk) int { func (x *PartialResponseStrategy) UnmarshalJSON(entry []byte) error { fieldStr, err := strconv.Unquote(string(entry)) if err != nil { - return errors.Wrapf(err, fmt.Sprintf("failed to unqote %v, in order to unmarshal as 'partial_response_strategy'. Possible values are %s", string(entry), strings.Join(PartialResponseStrategyValues, ","))) + return errors.Wrapf( + err, + "failed to unqote %v, in order to unmarshal as 'partial_response_strategy'. Possible values are %s", string(entry), strings.Join(PartialResponseStrategyValues, ","), + ) } if fieldStr == "" { @@ -340,7 +343,11 @@ func (x *PartialResponseStrategy) UnmarshalJSON(entry []byte) error { strategy, ok := PartialResponseStrategy_value[strings.ToUpper(fieldStr)] if !ok { - return errors.Errorf(fmt.Sprintf("failed to unmarshal %v as 'partial_response_strategy'. Possible values are %s", string(entry), strings.Join(PartialResponseStrategyValues, ","))) + return errors.Errorf( + "failed to unmarshal %v as 'partial_response_strategy'. Possible values are %s", + string(entry), + strings.Join(PartialResponseStrategyValues, ","), + ) } *x = PartialResponseStrategy(strategy) return nil diff --git a/pkg/store/storepb/custom_test.go b/pkg/store/storepb/custom_test.go index eff2be6e80..4a1c6d83c2 100644 --- a/pkg/store/storepb/custom_test.go +++ b/pkg/store/storepb/custom_test.go @@ -12,10 +12,11 @@ import ( "github.com/pkg/errors" "github.com/prometheus/prometheus/model/labels" - "github.com/prometheus/prometheus/promql/parser" "github.com/prometheus/prometheus/tsdb/chunkenc" "github.com/efficientgo/core/testutil" + + "github.com/thanos-io/thanos/pkg/extpromql" "github.com/thanos-io/thanos/pkg/store/labelpb" ) @@ -520,8 +521,8 @@ func TestMatchersToString_Translate(t *testing.T) { testutil.Equals(t, c.expected, MatchersToString(ms...)) // Is this parsable? - promMsParsed, err := parser.ParseMetricSelector(c.expected) - testutil.Ok(t, err) + promMsParsed, err := extpromql.ParseMetricSelector(c.expected) + testutil.Ok(t, err, "unexpected error parsing %q", c.expected) testutil.Assert(t, len(promMs) == len(promMsParsed)) for i := 0; i < len(promMs); i++ { testutil.Equals(t, promMs[i].String(), promMsParsed[i].String()) diff --git a/pkg/store/storepb/inprocess.go b/pkg/store/storepb/inprocess.go index e09210d442..0c3e7641ba 100644 --- a/pkg/store/storepb/inprocess.go +++ b/pkg/store/storepb/inprocess.go @@ -6,99 +6,100 @@ package storepb import ( "context" "io" + "iter" "google.golang.org/grpc" ) -func ServerAsClient(srv StoreServer) StoreClient { - return &serverAsClient{srv: srv} +type inProcessServer struct { + Store_SeriesServer + ctx context.Context + yield func(response *SeriesResponse, err error) bool } -// serverAsClient allows to use servers as clients. -// NOTE: Passing CallOptions does not work - it would be needed to be implemented in grpc itself (before, after are private). -type serverAsClient struct { - srv StoreServer -} - -func (s serverAsClient) Info(ctx context.Context, in *InfoRequest, _ ...grpc.CallOption) (*InfoResponse, error) { - return s.srv.Info(ctx, in) +func newInProcessServer(ctx context.Context, yield func(*SeriesResponse, error) bool) *inProcessServer { + return &inProcessServer{ + ctx: ctx, + yield: yield, + } } -func (s serverAsClient) LabelNames(ctx context.Context, in *LabelNamesRequest, _ ...grpc.CallOption) (*LabelNamesResponse, error) { - return s.srv.LabelNames(ctx, in) +func (s *inProcessServer) Send(resp *SeriesResponse) error { + s.yield(resp, nil) + return nil } -func (s serverAsClient) LabelValues(ctx context.Context, in *LabelValuesRequest, _ ...grpc.CallOption) (*LabelValuesResponse, error) { - return s.srv.LabelValues(ctx, in) +func (s *inProcessServer) Context() context.Context { + return s.ctx } -func (s serverAsClient) Series(ctx context.Context, in *SeriesRequest, _ ...grpc.CallOption) (Store_SeriesClient, error) { - inSrv := &inProcessStream{recv: make(chan *SeriesResponse), err: make(chan error)} - inSrv.ctx, inSrv.cancel = context.WithCancel(ctx) - go func() { - if err := s.srv.Series(in, inSrv); err != nil { - inSrv.err <- err - } - close(inSrv.err) - close(inSrv.recv) - }() - return &inProcessClientStream{srv: inSrv}, nil +type inProcessClient struct { + Store_SeriesClient + ctx context.Context + next func() (*SeriesResponse, error, bool) + stop func() } -// TODO(bwplotka): Add streaming attributes, metadata etc. Currently those are disconnected. Follow up on https://github.com/grpc/grpc-go/issues/906. -// TODO(bwplotka): Use this in proxy.go and receiver multi tenant proxy. -type inProcessStream struct { - grpc.ServerStream - - ctx context.Context - cancel context.CancelFunc - recv chan *SeriesResponse - err chan error +func newInProcessClient(ctx context.Context, next func() (*SeriesResponse, error, bool), stop func()) *inProcessClient { + return &inProcessClient{ + ctx: ctx, + next: next, + stop: stop, + } } -func NewInProcessStream(ctx context.Context, bufferSize int) *inProcessStream { - return &inProcessStream{ - ctx: ctx, - recv: make(chan *SeriesResponse, bufferSize), - err: make(chan error), +func (c *inProcessClient) Recv() (*SeriesResponse, error) { + resp, err, ok := c.next() + if err != nil { + c.stop() + return nil, err } + if !ok { + if c.ctx.Err() != nil { + return nil, c.ctx.Err() + } + return nil, io.EOF + } + return resp, err } -func (s *inProcessStream) Context() context.Context { return s.ctx } +func (c *inProcessClient) Context() context.Context { + return c.ctx +} -func (s *inProcessStream) Send(r *SeriesResponse) error { - select { - case <-s.ctx.Done(): - return s.ctx.Err() - case s.recv <- r: - return nil - } +func (c *inProcessClient) CloseSend() error { + c.stop() + return nil } -type inProcessClientStream struct { - grpc.ClientStream +func ServerAsClient(srv StoreServer) StoreClient { + return &serverAsClient{srv: srv} +} - srv *inProcessStream +// serverAsClient allows to use servers as clients. +// NOTE: Passing CallOptions does not work - it would be needed to be implemented in grpc itself (before, after are private). +type serverAsClient struct { + srv StoreServer } -func (s *inProcessClientStream) Context() context.Context { return s.srv.ctx } +func (s serverAsClient) LabelNames(ctx context.Context, in *LabelNamesRequest, _ ...grpc.CallOption) (*LabelNamesResponse, error) { + return s.srv.LabelNames(ctx, in) +} -func (s *inProcessClientStream) CloseSend() error { - s.srv.cancel() - return nil +func (s serverAsClient) LabelValues(ctx context.Context, in *LabelValuesRequest, _ ...grpc.CallOption) (*LabelValuesResponse, error) { + return s.srv.LabelValues(ctx, in) } -func (s *inProcessClientStream) Recv() (*SeriesResponse, error) { - select { - case r, ok := <-s.srv.recv: - if !ok { - return nil, io.EOF - } - return r, nil - case err, ok := <-s.srv.err: - if !ok { - return nil, io.EOF +func (s serverAsClient) Series(ctx context.Context, in *SeriesRequest, _ ...grpc.CallOption) (Store_SeriesClient, error) { + var srvIter iter.Seq2[*SeriesResponse, error] = func(yield func(*SeriesResponse, error) bool) { + srv := newInProcessServer(ctx, yield) + err := s.srv.Series(in, srv) + if err != nil { + yield(nil, err) + return } - return nil, err } + + clientIter, stop := iter.Pull2(srvIter) + return newInProcessClient(ctx, clientIter, stop), nil } diff --git a/pkg/store/storepb/inprocess_test.go b/pkg/store/storepb/inprocess_test.go index b046ccc4c0..f033b579b0 100644 --- a/pkg/store/storepb/inprocess_test.go +++ b/pkg/store/storepb/inprocess_test.go @@ -5,19 +5,17 @@ package storepb import ( "context" - "fmt" "io" "testing" + "github.com/thanos-io/thanos/pkg/testutil/custom" + "github.com/efficientgo/core/testutil" "github.com/pkg/errors" "github.com/thanos-io/thanos/pkg/store/labelpb" ) type testStoreServer struct { - info *InfoResponse - infoLastReq *InfoRequest - series []*SeriesResponse seriesLastReq *SeriesRequest @@ -30,11 +28,6 @@ type testStoreServer struct { err error } -func (t *testStoreServer) Info(_ context.Context, r *InfoRequest) (*InfoResponse, error) { - t.infoLastReq = r - return t.info, t.err -} - func (t *testStoreServer) Series(r *SeriesRequest, server Store_SeriesServer) error { t.seriesLastReq = r for i, s := range t.series { @@ -59,208 +52,172 @@ func (t *testStoreServer) LabelValues(_ context.Context, r *LabelValuesRequest) } func TestServerAsClient(t *testing.T) { + defer custom.TolerantVerifyLeak(t) + ctx := context.Background() - for _, bufferSize := range []int{0, 1, 20, 100} { - t.Run(fmt.Sprintf("buffer=%v", bufferSize), func(t *testing.T) { - t.Run("Info", func(t *testing.T) { - s := &testStoreServer{ - info: &InfoResponse{ - LabelSets: []labelpb.ZLabelSet{{Labels: []labelpb.ZLabel{{Name: "a", Value: "b"}}}}, - MinTime: -1, - MaxTime: 10, - StoreType: StoreType_DEBUG, - }} - t.Run("ok", func(t *testing.T) { - for i := 0; i < 20; i++ { - r := &InfoRequest{} - resp, err := ServerAsClient(s).Info(ctx, r) - testutil.Ok(t, err) - testutil.Equals(t, s.info, resp) - testutil.Equals(t, r, s.infoLastReq) - s.infoLastReq = nil - } - }) - t.Run("error", func(t *testing.T) { - s.err = errors.New("some error") - for i := 0; i < 20; i++ { - r := &InfoRequest{} - _, err := ServerAsClient(s).Info(ctx, r) - testutil.NotOk(t, err) - testutil.Equals(t, s.err, err) - } - }) - }) - t.Run("Series", func(t *testing.T) { - s := &testStoreServer{ - series: []*SeriesResponse{ - NewSeriesResponse(&Series{ - Labels: []labelpb.ZLabel{{Name: "a", Value: "b"}}, - Chunks: []AggrChunk{{MinTime: 123, MaxTime: 124}, {MinTime: 12455, MaxTime: 14124}}, - }), - NewSeriesResponse(&Series{ - Labels: []labelpb.ZLabel{{Name: "a", Value: "b1"}}, - Chunks: []AggrChunk{{MinTime: 1231, MaxTime: 124}, {MinTime: 12455, MaxTime: 14124}}, - }), - NewWarnSeriesResponse(errors.New("yolo")), - NewSeriesResponse(&Series{ - Labels: []labelpb.ZLabel{{Name: "a", Value: "b3"}}, - Chunks: []AggrChunk{{MinTime: 123, MaxTime: 124}, {MinTime: 124554, MaxTime: 14124}}, - }), - }} - t.Run("ok", func(t *testing.T) { - for i := 0; i < 20; i++ { - r := &SeriesRequest{ - MinTime: -214, - MaxTime: 213, - Matchers: []LabelMatcher{{Value: "wfsdfs", Name: "__name__", Type: LabelMatcher_EQ}}, - PartialResponseStrategy: PartialResponseStrategy_ABORT, - } - client, err := ServerAsClient(s).Series(ctx, r) - testutil.Ok(t, err) - var resps []*SeriesResponse - for { - resp, err := client.Recv() - if err == io.EOF { - break - } - testutil.Ok(t, err) - resps = append(resps, resp) - } - testutil.Equals(t, s.series, resps) - testutil.Equals(t, r, s.seriesLastReq) - s.seriesLastReq = nil - } - }) - t.Run("ok, close send", func(t *testing.T) { - s.err = errors.New("some error") - for i := 0; i < 20; i++ { - r := &SeriesRequest{ - MinTime: -214, - MaxTime: 213, - Matchers: []LabelMatcher{{Value: "wfsdfs", Name: "__name__", Type: LabelMatcher_EQ}}, - PartialResponseStrategy: PartialResponseStrategy_ABORT, - } - client, err := ServerAsClient(s).Series(ctx, r) - testutil.Ok(t, err) - var resps []*SeriesResponse - for { - if len(resps) == len(s.series)/2 { - testutil.Ok(t, client.CloseSend()) - break - } - resp, err := client.Recv() - if err == io.EOF { - break - } - testutil.Ok(t, err) - resps = append(resps, resp) - } - testutil.Equals(t, s.series[:len(s.series)/2], resps) - testutil.Equals(t, r, s.seriesLastReq) - s.seriesLastReq = nil - } - }) - t.Run("error", func(t *testing.T) { - for i := 0; i < 20; i++ { - r := &SeriesRequest{ - MinTime: -214, - MaxTime: 213, - Matchers: []LabelMatcher{{Value: "wfsdfs", Name: "__name__", Type: LabelMatcher_EQ}}, - PartialResponseStrategy: PartialResponseStrategy_ABORT, - } - client, err := ServerAsClient(s).Series(ctx, r) - testutil.Ok(t, err) - var resps []*SeriesResponse - for { - resp, err := client.Recv() - if err == io.EOF { - break - } - if err == s.err { - break - } - testutil.Ok(t, err) - resps = append(resps, resp) - } - testutil.Equals(t, s.series[:len(s.series)/2], resps) - testutil.Equals(t, r, s.seriesLastReq) - s.seriesLastReq = nil + t.Run("Series", func(t *testing.T) { + s := &testStoreServer{ + series: []*SeriesResponse{ + NewSeriesResponse(&Series{ + Labels: []labelpb.ZLabel{{Name: "a", Value: "b"}}, + Chunks: []AggrChunk{{MinTime: 123, MaxTime: 124}, {MinTime: 12455, MaxTime: 14124}}, + }), + NewSeriesResponse(&Series{ + Labels: []labelpb.ZLabel{{Name: "a", Value: "b1"}}, + Chunks: []AggrChunk{{MinTime: 1231, MaxTime: 124}, {MinTime: 12455, MaxTime: 14124}}, + }), + NewWarnSeriesResponse(errors.New("yolo")), + NewSeriesResponse(&Series{ + Labels: []labelpb.ZLabel{{Name: "a", Value: "b3"}}, + Chunks: []AggrChunk{{MinTime: 123, MaxTime: 124}, {MinTime: 124554, MaxTime: 14124}}, + }), + }} + t.Run("ok", func(t *testing.T) { + for i := 0; i < 20; i++ { + r := &SeriesRequest{ + MinTime: -214, + MaxTime: 213, + Matchers: []LabelMatcher{{Value: "wfsdfs", Name: "__name__", Type: LabelMatcher_EQ}}, + PartialResponseStrategy: PartialResponseStrategy_ABORT, + } + client, err := ServerAsClient(s).Series(ctx, r) + testutil.Ok(t, err) + var resps []*SeriesResponse + for { + resp, err := client.Recv() + if err == io.EOF { + break } - }) - }) - t.Run("LabelNames", func(t *testing.T) { - s := &testStoreServer{ - info: &InfoResponse{ - LabelSets: []labelpb.ZLabelSet{{Labels: []labelpb.ZLabel{{Name: "a", Value: "b"}}}}, - MinTime: -1, - MaxTime: 10, - StoreType: StoreType_DEBUG, - }} - t.Run("ok", func(t *testing.T) { - for i := 0; i < 20; i++ { - r := &LabelNamesRequest{ - Start: -1, - End: 234, - PartialResponseStrategy: PartialResponseStrategy_ABORT, - } - resp, err := ServerAsClient(s).LabelNames(ctx, r) - testutil.Ok(t, err) - testutil.Equals(t, s.labelNames, resp) - testutil.Equals(t, r, s.labelNamesLastReq) - s.labelNamesLastReq = nil + testutil.Ok(t, err) + resps = append(resps, resp) + } + testutil.Equals(t, s.series, resps) + testutil.Equals(t, r, s.seriesLastReq) + s.seriesLastReq = nil + } + }) + t.Run("ok, close send", func(t *testing.T) { + s.err = errors.New("some error") + for i := 0; i < 20; i++ { + r := &SeriesRequest{ + MinTime: -214, + MaxTime: 213, + Matchers: []LabelMatcher{{Value: "wfsdfs", Name: "__name__", Type: LabelMatcher_EQ}}, + PartialResponseStrategy: PartialResponseStrategy_ABORT, + } + client, err := ServerAsClient(s).Series(ctx, r) + testutil.Ok(t, err) + var resps []*SeriesResponse + for { + if len(resps) == len(s.series)/2 { + testutil.Ok(t, client.CloseSend()) + break } - }) - t.Run("error", func(t *testing.T) { - s.err = errors.New("some error") - for i := 0; i < 20; i++ { - r := &LabelNamesRequest{ - Start: -1, - End: 234, - PartialResponseStrategy: PartialResponseStrategy_ABORT, - } - _, err := ServerAsClient(s).LabelNames(ctx, r) - testutil.NotOk(t, err) - testutil.Equals(t, s.err, err) + resp, err := client.Recv() + if err == io.EOF { + break } - }) - }) - t.Run("LabelValues", func(t *testing.T) { - s := &testStoreServer{ - labelValues: &LabelValuesResponse{ - Warnings: []string{"1", "a"}, - Values: []string{"abc1", "go_goroutines"}, - }, + testutil.Ok(t, err) + resps = append(resps, resp) } - t.Run("ok", func(t *testing.T) { - for i := 0; i < 20; i++ { - r := &LabelValuesRequest{ - Label: "__name__", - Start: -1, - End: 234, - PartialResponseStrategy: PartialResponseStrategy_ABORT, - } - resp, err := ServerAsClient(s).LabelValues(ctx, r) - testutil.Ok(t, err) - testutil.Equals(t, s.labelValues, resp) - testutil.Equals(t, r, s.labelValuesLastReq) - s.labelValuesLastReq = nil + testutil.Equals(t, s.series[:len(s.series)/2], resps) + testutil.Equals(t, r, s.seriesLastReq) + s.seriesLastReq = nil + } + }) + t.Run("error", func(t *testing.T) { + for i := 0; i < 20; i++ { + r := &SeriesRequest{ + MinTime: -214, + MaxTime: 213, + Matchers: []LabelMatcher{{Value: "wfsdfs", Name: "__name__", Type: LabelMatcher_EQ}}, + PartialResponseStrategy: PartialResponseStrategy_ABORT, + } + client, err := ServerAsClient(s).Series(ctx, r) + testutil.Ok(t, err) + var resps []*SeriesResponse + for { + resp, err := client.Recv() + if err == io.EOF { + break } - }) - t.Run("error", func(t *testing.T) { - s.err = errors.New("some error") - for i := 0; i < 20; i++ { - r := &LabelValuesRequest{ - Label: "__name__", - Start: -1, - End: 234, - PartialResponseStrategy: PartialResponseStrategy_ABORT, - } - _, err := ServerAsClient(s).LabelValues(ctx, r) - testutil.NotOk(t, err) - testutil.Equals(t, s.err, err) + if err == s.err { + break } - }) - }) + testutil.Ok(t, err) + resps = append(resps, resp) + } + testutil.Equals(t, s.series[:len(s.series)/2], resps) + testutil.Equals(t, r, s.seriesLastReq) + s.seriesLastReq = nil + } }) - } + }) + t.Run("LabelNames", func(t *testing.T) { + s := &testStoreServer{} + t.Run("ok", func(t *testing.T) { + for i := 0; i < 20; i++ { + r := &LabelNamesRequest{ + Start: -1, + End: 234, + PartialResponseStrategy: PartialResponseStrategy_ABORT, + } + resp, err := ServerAsClient(s).LabelNames(ctx, r) + testutil.Ok(t, err) + testutil.Equals(t, s.labelNames, resp) + testutil.Equals(t, r, s.labelNamesLastReq) + s.labelNamesLastReq = nil + } + }) + t.Run("error", func(t *testing.T) { + s.err = errors.New("some error") + for i := 0; i < 20; i++ { + r := &LabelNamesRequest{ + Start: -1, + End: 234, + PartialResponseStrategy: PartialResponseStrategy_ABORT, + } + _, err := ServerAsClient(s).LabelNames(ctx, r) + testutil.NotOk(t, err) + testutil.Equals(t, s.err, err) + } + }) + }) + t.Run("LabelValues", func(t *testing.T) { + s := &testStoreServer{ + labelValues: &LabelValuesResponse{ + Warnings: []string{"1", "a"}, + Values: []string{"abc1", "go_goroutines"}, + }, + } + t.Run("ok", func(t *testing.T) { + for i := 0; i < 20; i++ { + r := &LabelValuesRequest{ + Label: "__name__", + Start: -1, + End: 234, + PartialResponseStrategy: PartialResponseStrategy_ABORT, + } + resp, err := ServerAsClient(s).LabelValues(ctx, r) + testutil.Ok(t, err) + testutil.Equals(t, s.labelValues, resp) + testutil.Equals(t, r, s.labelValuesLastReq) + s.labelValuesLastReq = nil + } + }) + t.Run("error", func(t *testing.T) { + s.err = errors.New("some error") + for i := 0; i < 20; i++ { + r := &LabelValuesRequest{ + Label: "__name__", + Start: -1, + End: 234, + PartialResponseStrategy: PartialResponseStrategy_ABORT, + } + _, err := ServerAsClient(s).LabelValues(ctx, r) + testutil.NotOk(t, err) + testutil.Equals(t, s.err, err) + } + }) + }) } diff --git a/pkg/store/storepb/prompb/samples.go b/pkg/store/storepb/prompb/samples.go index 050b8e912f..0da00daf4d 100644 --- a/pkg/store/storepb/prompb/samples.go +++ b/pkg/store/storepb/prompb/samples.go @@ -61,7 +61,7 @@ func SamplesFromPromqlSeries(series promql.Series) ([]Sample, []Histogram) { // HistogramProtoToHistogram extracts a (normal integer) Histogram from the // provided proto message. The caller has to make sure that the proto message -// represents an interger histogram and not a float histogram. +// represents an integer histogram and not a float histogram. // Copied from https://github.com/prometheus/prometheus/blob/0ab95536115adfe50af249d36d73674be694ca3f/storage/remote/codec.go#L626-L645 func HistogramProtoToHistogram(hp Histogram) *histogram.Histogram { if hp.IsFloatHistogram() { diff --git a/pkg/store/storepb/rpc.pb.go b/pkg/store/storepb/rpc.pb.go index b5e85d69d8..9d39f27e14 100644 --- a/pkg/store/storepb/rpc.pb.go +++ b/pkg/store/storepb/rpc.pb.go @@ -13,8 +13,6 @@ import ( _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" types "github.com/gogo/protobuf/types" - github_com_thanos_io_thanos_pkg_store_labelpb "github.com/thanos-io/thanos/pkg/store/labelpb" - labelpb "github.com/thanos-io/thanos/pkg/store/labelpb" prompb "github.com/thanos-io/thanos/pkg/store/storepb/prompb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -32,48 +30,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// Deprecated. Use `thanos.info` instead. -type StoreType int32 - -const ( - StoreType_UNKNOWN StoreType = 0 - StoreType_QUERY StoreType = 1 - StoreType_RULE StoreType = 2 - StoreType_SIDECAR StoreType = 3 - StoreType_STORE StoreType = 4 - StoreType_RECEIVE StoreType = 5 - // DEBUG represents some debug StoreAPI components e.g. thanos tools store-api-serve. - StoreType_DEBUG StoreType = 6 -) - -var StoreType_name = map[int32]string{ - 0: "UNKNOWN", - 1: "QUERY", - 2: "RULE", - 3: "SIDECAR", - 4: "STORE", - 5: "RECEIVE", - 6: "DEBUG", -} - -var StoreType_value = map[string]int32{ - "UNKNOWN": 0, - "QUERY": 1, - "RULE": 2, - "SIDECAR": 3, - "STORE": 4, - "RECEIVE": 5, - "DEBUG": 6, -} - -func (x StoreType) String() string { - return proto.EnumName(StoreType_name, int32(x)) -} - -func (StoreType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{0} -} - type Aggr int32 const ( @@ -108,7 +64,7 @@ func (x Aggr) String() string { } func (Aggr) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{1} + return fileDescriptor_a938d55a388af629, []int{0} } type WriteResponse struct { @@ -186,87 +142,6 @@ func (m *WriteRequest) XXX_DiscardUnknown() { var xxx_messageInfo_WriteRequest proto.InternalMessageInfo -// Deprecated. Use `thanos.info` instead. -type InfoRequest struct { -} - -func (m *InfoRequest) Reset() { *m = InfoRequest{} } -func (m *InfoRequest) String() string { return proto.CompactTextString(m) } -func (*InfoRequest) ProtoMessage() {} -func (*InfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{2} -} -func (m *InfoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *InfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_InfoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *InfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_InfoRequest.Merge(m, src) -} -func (m *InfoRequest) XXX_Size() int { - return m.Size() -} -func (m *InfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_InfoRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_InfoRequest proto.InternalMessageInfo - -// Deprecated. Use `thanos.info` instead. -type InfoResponse struct { - // Deprecated. Use label_sets instead. - Labels []github_com_thanos_io_thanos_pkg_store_labelpb.ZLabel `protobuf:"bytes,1,rep,name=labels,proto3,customtype=github.com/thanos-io/thanos/pkg/store/labelpb.ZLabel" json:"labels"` - MinTime int64 `protobuf:"varint,2,opt,name=min_time,json=minTime,proto3" json:"min_time,omitempty"` - MaxTime int64 `protobuf:"varint,3,opt,name=max_time,json=maxTime,proto3" json:"max_time,omitempty"` - StoreType StoreType `protobuf:"varint,4,opt,name=storeType,proto3,enum=thanos.StoreType" json:"storeType,omitempty"` - // label_sets is an unsorted list of `ZLabelSet`s. - LabelSets []labelpb.ZLabelSet `protobuf:"bytes,5,rep,name=label_sets,json=labelSets,proto3" json:"label_sets"` -} - -func (m *InfoResponse) Reset() { *m = InfoResponse{} } -func (m *InfoResponse) String() string { return proto.CompactTextString(m) } -func (*InfoResponse) ProtoMessage() {} -func (*InfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{3} -} -func (m *InfoResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *InfoResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_InfoResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *InfoResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_InfoResponse.Merge(m, src) -} -func (m *InfoResponse) XXX_Size() int { - return m.Size() -} -func (m *InfoResponse) XXX_DiscardUnknown() { - xxx_messageInfo_InfoResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_InfoResponse proto.InternalMessageInfo - type SeriesRequest struct { MinTime int64 `protobuf:"varint,1,opt,name=min_time,json=minTime,proto3" json:"min_time,omitempty"` MaxTime int64 `protobuf:"varint,2,opt,name=max_time,json=maxTime,proto3" json:"max_time,omitempty"` @@ -305,13 +180,15 @@ type SeriesRequest struct { // NOTE(bwplotka): thanos.info.store.supports_without_replica_labels field has to return true to let client knows // server supports it. WithoutReplicaLabels []string `protobuf:"bytes,14,rep,name=without_replica_labels,json=withoutReplicaLabels,proto3" json:"without_replica_labels,omitempty"` + // limit is used to limit the number of results returned + Limit int64 `protobuf:"varint,15,opt,name=limit,proto3" json:"limit,omitempty"` } func (m *SeriesRequest) Reset() { *m = SeriesRequest{} } func (m *SeriesRequest) String() string { return proto.CompactTextString(m) } func (*SeriesRequest) ProtoMessage() {} func (*SeriesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{4} + return fileDescriptor_a938d55a388af629, []int{2} } func (m *SeriesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -359,7 +236,7 @@ func (m *QueryHints) Reset() { *m = QueryHints{} } func (m *QueryHints) String() string { return proto.CompactTextString(m) } func (*QueryHints) ProtoMessage() {} func (*QueryHints) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{5} + return fileDescriptor_a938d55a388af629, []int{3} } func (m *QueryHints) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -404,7 +281,7 @@ func (m *ShardInfo) Reset() { *m = ShardInfo{} } func (m *ShardInfo) String() string { return proto.CompactTextString(m) } func (*ShardInfo) ProtoMessage() {} func (*ShardInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{6} + return fileDescriptor_a938d55a388af629, []int{4} } func (m *ShardInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -442,7 +319,7 @@ func (m *Func) Reset() { *m = Func{} } func (m *Func) String() string { return proto.CompactTextString(m) } func (*Func) ProtoMessage() {} func (*Func) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{7} + return fileDescriptor_a938d55a388af629, []int{5} } func (m *Func) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -482,7 +359,7 @@ func (m *Grouping) Reset() { *m = Grouping{} } func (m *Grouping) String() string { return proto.CompactTextString(m) } func (*Grouping) ProtoMessage() {} func (*Grouping) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{8} + return fileDescriptor_a938d55a388af629, []int{6} } func (m *Grouping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -519,7 +396,7 @@ func (m *Range) Reset() { *m = Range{} } func (m *Range) String() string { return proto.CompactTextString(m) } func (*Range) ProtoMessage() {} func (*Range) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{9} + return fileDescriptor_a938d55a388af629, []int{7} } func (m *Range) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -560,7 +437,7 @@ func (m *SeriesResponse) Reset() { *m = SeriesResponse{} } func (m *SeriesResponse) String() string { return proto.CompactTextString(m) } func (*SeriesResponse) ProtoMessage() {} func (*SeriesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{10} + return fileDescriptor_a938d55a388af629, []int{8} } func (m *SeriesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -659,13 +536,15 @@ type LabelNamesRequest struct { Matchers []LabelMatcher `protobuf:"bytes,6,rep,name=matchers,proto3" json:"matchers"` // same as in series request. WithoutReplicaLabels []string `protobuf:"bytes,7,rep,name=without_replica_labels,json=withoutReplicaLabels,proto3" json:"without_replica_labels,omitempty"` + // limit is used to limit the number of results returned + Limit int64 `protobuf:"varint,8,opt,name=limit,proto3" json:"limit,omitempty"` } func (m *LabelNamesRequest) Reset() { *m = LabelNamesRequest{} } func (m *LabelNamesRequest) String() string { return proto.CompactTextString(m) } func (*LabelNamesRequest) ProtoMessage() {} func (*LabelNamesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{11} + return fileDescriptor_a938d55a388af629, []int{9} } func (m *LabelNamesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -707,7 +586,7 @@ func (m *LabelNamesResponse) Reset() { *m = LabelNamesResponse{} } func (m *LabelNamesResponse) String() string { return proto.CompactTextString(m) } func (*LabelNamesResponse) ProtoMessage() {} func (*LabelNamesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{12} + return fileDescriptor_a938d55a388af629, []int{10} } func (m *LabelNamesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -750,13 +629,15 @@ type LabelValuesRequest struct { Matchers []LabelMatcher `protobuf:"bytes,7,rep,name=matchers,proto3" json:"matchers"` // same as in series request. WithoutReplicaLabels []string `protobuf:"bytes,8,rep,name=without_replica_labels,json=withoutReplicaLabels,proto3" json:"without_replica_labels,omitempty"` + // limit is used to limit the number of results returned + Limit int64 `protobuf:"varint,9,opt,name=limit,proto3" json:"limit,omitempty"` } func (m *LabelValuesRequest) Reset() { *m = LabelValuesRequest{} } func (m *LabelValuesRequest) String() string { return proto.CompactTextString(m) } func (*LabelValuesRequest) ProtoMessage() {} func (*LabelValuesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{13} + return fileDescriptor_a938d55a388af629, []int{11} } func (m *LabelValuesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -798,7 +679,7 @@ func (m *LabelValuesResponse) Reset() { *m = LabelValuesResponse{} } func (m *LabelValuesResponse) String() string { return proto.CompactTextString(m) } func (*LabelValuesResponse) ProtoMessage() {} func (*LabelValuesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_a938d55a388af629, []int{14} + return fileDescriptor_a938d55a388af629, []int{12} } func (m *LabelValuesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -828,12 +709,9 @@ func (m *LabelValuesResponse) XXX_DiscardUnknown() { var xxx_messageInfo_LabelValuesResponse proto.InternalMessageInfo func init() { - proto.RegisterEnum("thanos.StoreType", StoreType_name, StoreType_value) proto.RegisterEnum("thanos.Aggr", Aggr_name, Aggr_value) proto.RegisterType((*WriteResponse)(nil), "thanos.WriteResponse") proto.RegisterType((*WriteRequest)(nil), "thanos.WriteRequest") - proto.RegisterType((*InfoRequest)(nil), "thanos.InfoRequest") - proto.RegisterType((*InfoResponse)(nil), "thanos.InfoResponse") proto.RegisterType((*SeriesRequest)(nil), "thanos.SeriesRequest") proto.RegisterType((*QueryHints)(nil), "thanos.QueryHints") proto.RegisterType((*ShardInfo)(nil), "thanos.ShardInfo") @@ -850,91 +728,79 @@ func init() { func init() { proto.RegisterFile("store/storepb/rpc.proto", fileDescriptor_a938d55a388af629) } var fileDescriptor_a938d55a388af629 = []byte{ - // 1331 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x6f, 0x13, 0x47, - 0x14, 0xf7, 0x7a, 0xbd, 0xfe, 0xf3, 0x9c, 0xb8, 0x66, 0x30, 0x61, 0x63, 0x24, 0xc7, 0x75, 0x55, - 0xc9, 0x42, 0xd4, 0xa6, 0x06, 0x21, 0xb5, 0xe2, 0x92, 0x04, 0x43, 0xa2, 0x12, 0x53, 0xc6, 0x09, - 0x69, 0xa9, 0x2a, 0x6b, 0x6d, 0x4f, 0xd6, 0x2b, 0xec, 0xdd, 0x65, 0x67, 0xb6, 0x89, 0xaf, 0xad, - 0x7a, 0xab, 0xaa, 0xaa, 0x1f, 0xa1, 0x9f, 0x86, 0x23, 0xc7, 0xaa, 0x07, 0xd4, 0xc2, 0xbd, 0x9f, - 0xa1, 0x9a, 0x3f, 0xbb, 0xf6, 0xa6, 0x21, 0x08, 0x91, 0x4b, 0x34, 0xef, 0xf7, 0x7b, 0xf3, 0xe6, - 0xfd, 0xcf, 0x1a, 0xae, 0x52, 0xe6, 0x05, 0xa4, 0x2d, 0xfe, 0xfa, 0xc3, 0x76, 0xe0, 0x8f, 0x5a, - 0x7e, 0xe0, 0x31, 0x0f, 0x65, 0xd9, 0xc4, 0x72, 0x3d, 0x5a, 0x5d, 0x4f, 0x2a, 0xb0, 0xb9, 0x4f, - 0xa8, 0x54, 0xa9, 0x56, 0x6c, 0xcf, 0xf6, 0xc4, 0xb1, 0xcd, 0x4f, 0x0a, 0xad, 0x27, 0x2f, 0xf8, - 0x81, 0x37, 0x3b, 0x75, 0x4f, 0x99, 0x9c, 0x5a, 0x43, 0x32, 0x3d, 0x4d, 0xd9, 0x9e, 0x67, 0x4f, - 0x49, 0x5b, 0x48, 0xc3, 0xf0, 0xa8, 0x6d, 0xb9, 0x73, 0x49, 0x35, 0x3e, 0x82, 0xd5, 0xc3, 0xc0, - 0x61, 0x04, 0x13, 0xea, 0x7b, 0x2e, 0x25, 0x8d, 0x9f, 0x34, 0x58, 0x51, 0xc8, 0xf3, 0x90, 0x50, - 0x86, 0x36, 0x01, 0x98, 0x33, 0x23, 0x94, 0x04, 0x0e, 0xa1, 0xa6, 0x56, 0xd7, 0x9b, 0xc5, 0xce, - 0x35, 0x7e, 0x7b, 0x46, 0xd8, 0x84, 0x84, 0x74, 0x30, 0xf2, 0xfc, 0x79, 0x6b, 0xdf, 0x99, 0x91, - 0xbe, 0x50, 0xd9, 0xca, 0xbc, 0x78, 0xb5, 0x91, 0xc2, 0x4b, 0x97, 0xd0, 0x1a, 0x64, 0x19, 0x71, - 0x2d, 0x97, 0x99, 0xe9, 0xba, 0xd6, 0x2c, 0x60, 0x25, 0x21, 0x13, 0x72, 0x01, 0xf1, 0xa7, 0xce, - 0xc8, 0x32, 0xf5, 0xba, 0xd6, 0xd4, 0x71, 0x24, 0x36, 0x56, 0xa1, 0xb8, 0xeb, 0x1e, 0x79, 0xca, - 0x87, 0xc6, 0xef, 0x69, 0x58, 0x91, 0xb2, 0xf4, 0x12, 0x8d, 0x20, 0x2b, 0x02, 0x8d, 0x1c, 0x5a, - 0x6d, 0xc9, 0xc4, 0xb6, 0x1e, 0x72, 0x74, 0xeb, 0x2e, 0x77, 0xe1, 0xaf, 0x57, 0x1b, 0xb7, 0x6d, - 0x87, 0x4d, 0xc2, 0x61, 0x6b, 0xe4, 0xcd, 0xda, 0x52, 0xe1, 0x33, 0xc7, 0x53, 0xa7, 0xb6, 0xff, - 0xcc, 0x6e, 0x27, 0x72, 0xd6, 0x7a, 0x2a, 0x6e, 0x63, 0x65, 0x1a, 0xad, 0x43, 0x7e, 0xe6, 0xb8, - 0x03, 0x1e, 0x88, 0x70, 0x5c, 0xc7, 0xb9, 0x99, 0xe3, 0xf2, 0x48, 0x05, 0x65, 0x9d, 0x48, 0x4a, - 0xb9, 0x3e, 0xb3, 0x4e, 0x04, 0xd5, 0x86, 0x82, 0xb0, 0xba, 0x3f, 0xf7, 0x89, 0x99, 0xa9, 0x6b, - 0xcd, 0x52, 0xe7, 0x52, 0xe4, 0x5d, 0x3f, 0x22, 0xf0, 0x42, 0x07, 0xdd, 0x01, 0x10, 0x0f, 0x0e, - 0x28, 0x61, 0xd4, 0x34, 0x44, 0x3c, 0xf1, 0x0d, 0xe9, 0x52, 0x9f, 0x30, 0x95, 0xd6, 0xc2, 0x54, - 0xc9, 0xb4, 0xf1, 0x8b, 0x01, 0xab, 0x32, 0xe5, 0x51, 0xa9, 0x96, 0x1d, 0xd6, 0xde, 0xee, 0x70, - 0x3a, 0xe9, 0xf0, 0x1d, 0x4e, 0xb1, 0xd1, 0x84, 0x04, 0xd4, 0xd4, 0xc5, 0xeb, 0x95, 0x44, 0x36, - 0xf7, 0x24, 0xa9, 0x1c, 0x88, 0x75, 0x51, 0x07, 0xae, 0x70, 0x93, 0x01, 0xa1, 0xde, 0x34, 0x64, - 0x8e, 0xe7, 0x0e, 0x8e, 0x1d, 0x77, 0xec, 0x1d, 0x8b, 0xa0, 0x75, 0x7c, 0x79, 0x66, 0x9d, 0xe0, - 0x98, 0x3b, 0x14, 0x14, 0xba, 0x01, 0x60, 0xd9, 0x76, 0x40, 0x6c, 0x8b, 0x11, 0x19, 0x6b, 0xa9, - 0xb3, 0x12, 0xbd, 0xb6, 0x69, 0xdb, 0x01, 0x5e, 0xe2, 0xd1, 0x97, 0xb0, 0xee, 0x5b, 0x01, 0x73, - 0xac, 0x29, 0x7f, 0x45, 0x54, 0x7e, 0x30, 0x76, 0xa8, 0x35, 0x9c, 0x92, 0xb1, 0x99, 0xad, 0x6b, - 0xcd, 0x3c, 0xbe, 0xaa, 0x14, 0xa2, 0xce, 0xb8, 0xa7, 0x68, 0xf4, 0xdd, 0x19, 0x77, 0x29, 0x0b, - 0x2c, 0x46, 0xec, 0xb9, 0x99, 0x13, 0x65, 0xd9, 0x88, 0x1e, 0xfe, 0x3a, 0x69, 0xa3, 0xaf, 0xd4, - 0xfe, 0x67, 0x3c, 0x22, 0xd0, 0x06, 0x14, 0xe9, 0x33, 0xc7, 0x1f, 0x8c, 0x26, 0xa1, 0xfb, 0x8c, - 0x9a, 0x79, 0xe1, 0x0a, 0x70, 0x68, 0x5b, 0x20, 0xe8, 0x3a, 0x18, 0x13, 0xc7, 0x65, 0xd4, 0x2c, - 0xd4, 0x35, 0x91, 0x50, 0x39, 0x81, 0xad, 0x68, 0x02, 0x5b, 0x9b, 0xee, 0x1c, 0x4b, 0x15, 0x84, - 0x20, 0x43, 0x19, 0xf1, 0x4d, 0x10, 0x69, 0x13, 0x67, 0x54, 0x01, 0x23, 0xb0, 0x5c, 0x9b, 0x98, - 0x45, 0x01, 0x4a, 0x01, 0xdd, 0x82, 0xe2, 0xf3, 0x90, 0x04, 0xf3, 0x81, 0xb4, 0xbd, 0x22, 0x6c, - 0xa3, 0x28, 0x8a, 0xc7, 0x9c, 0xda, 0xe1, 0x0c, 0x86, 0xe7, 0xf1, 0x19, 0xdd, 0x04, 0xa0, 0x13, - 0x2b, 0x18, 0x0f, 0x1c, 0xf7, 0xc8, 0x33, 0x57, 0xc5, 0x9d, 0x45, 0x43, 0x72, 0x46, 0x4c, 0x56, - 0x81, 0x46, 0x47, 0x74, 0x1b, 0xd6, 0x8e, 0x1d, 0x36, 0xf1, 0x42, 0x36, 0x50, 0xf3, 0x38, 0x50, - 0xc3, 0x56, 0xaa, 0xeb, 0xcd, 0x02, 0xae, 0x28, 0x16, 0x4b, 0x52, 0x34, 0x09, 0x6d, 0xfc, 0xa1, - 0x01, 0x2c, 0x5c, 0x10, 0x29, 0x62, 0xc4, 0x1f, 0xcc, 0x9c, 0xe9, 0xd4, 0xa1, 0xaa, 0x1d, 0x81, - 0x43, 0x7b, 0x02, 0x41, 0x75, 0xc8, 0x1c, 0x85, 0xee, 0x48, 0x74, 0x63, 0x71, 0xd1, 0x04, 0xf7, - 0x43, 0x77, 0x84, 0x05, 0x83, 0x6e, 0x40, 0xde, 0x0e, 0xbc, 0xd0, 0x77, 0x5c, 0x5b, 0xf4, 0x54, - 0xb1, 0x53, 0x8e, 0xb4, 0x1e, 0x28, 0x1c, 0xc7, 0x1a, 0xe8, 0x93, 0x28, 0x65, 0x86, 0x50, 0x8d, - 0x37, 0x02, 0xe6, 0xa0, 0xca, 0x60, 0xe3, 0x18, 0x0a, 0x71, 0xc8, 0xc2, 0x45, 0x95, 0x99, 0x31, - 0x39, 0x89, 0x5d, 0x94, 0xfc, 0x98, 0x9c, 0xa0, 0x8f, 0x61, 0x85, 0x79, 0xcc, 0x9a, 0x0e, 0x04, - 0x46, 0xd5, 0xe0, 0x14, 0x05, 0x26, 0xcc, 0x50, 0x54, 0x82, 0xf4, 0x70, 0x2e, 0x56, 0x40, 0x1e, - 0xa7, 0x87, 0x73, 0xbe, 0xea, 0x54, 0xae, 0x32, 0x22, 0x57, 0x4a, 0x6a, 0x54, 0x21, 0xc3, 0x23, - 0xe3, 0xc5, 0x76, 0x2d, 0x35, 0x9e, 0x05, 0x2c, 0xce, 0x8d, 0x0e, 0xe4, 0xa3, 0x78, 0x94, 0x3d, - 0xed, 0x0c, 0x7b, 0x7a, 0xc2, 0xde, 0x06, 0x18, 0x22, 0x30, 0xae, 0x90, 0x48, 0xb1, 0x92, 0x1a, - 0xbf, 0x6a, 0x50, 0x8a, 0xb6, 0x83, 0x5a, 0x9a, 0x4d, 0xc8, 0xc6, 0x5b, 0x9c, 0xa7, 0xa8, 0x14, - 0x77, 0x81, 0x40, 0x77, 0x52, 0x58, 0xf1, 0xa8, 0x0a, 0xb9, 0x63, 0x2b, 0x70, 0x79, 0xe2, 0xc5, - 0xc6, 0xde, 0x49, 0xe1, 0x08, 0x40, 0x37, 0xa2, 0xd6, 0xd6, 0xdf, 0xde, 0xda, 0x3b, 0x29, 0xd5, - 0xdc, 0x5b, 0x79, 0xc8, 0x06, 0x84, 0x86, 0x53, 0xd6, 0xf8, 0x37, 0x0d, 0x97, 0x44, 0xab, 0xf4, - 0xac, 0xd9, 0x62, 0x65, 0x9d, 0x3b, 0xe2, 0xda, 0x07, 0x8c, 0x78, 0xfa, 0x03, 0x47, 0xbc, 0x02, - 0x06, 0x65, 0x56, 0xc0, 0xd4, 0x7a, 0x97, 0x02, 0x2a, 0x83, 0x4e, 0xdc, 0xb1, 0xda, 0x70, 0xfc, - 0xb8, 0x98, 0x74, 0xe3, 0xdd, 0x93, 0xbe, 0xbc, 0x69, 0xb3, 0xef, 0xb1, 0x69, 0xdf, 0x3e, 0x90, - 0xb9, 0x73, 0x06, 0x32, 0x00, 0xb4, 0x9c, 0x6f, 0xd5, 0x04, 0x15, 0x30, 0x78, 0xd3, 0xc9, 0x7f, - 0x9c, 0x05, 0x2c, 0x05, 0x54, 0x85, 0xbc, 0xaa, 0x2f, 0xef, 0x72, 0x4e, 0xc4, 0xf2, 0x22, 0x42, - 0xfd, 0x9d, 0x11, 0x36, 0x7e, 0xd6, 0xd5, 0xa3, 0x4f, 0xac, 0x69, 0xb8, 0xa8, 0x72, 0x05, 0x0c, - 0xe1, 0xb0, 0x6a, 0x7b, 0x29, 0x9c, 0x5f, 0xfb, 0xf4, 0x07, 0xd4, 0x5e, 0xbf, 0xa8, 0xda, 0x67, - 0xce, 0xa8, 0xbd, 0x71, 0x46, 0xed, 0xb3, 0xef, 0x57, 0xfb, 0xdc, 0x85, 0xd4, 0x3e, 0x7f, 0x4e, - 0xed, 0x43, 0xb8, 0x9c, 0x28, 0x83, 0x2a, 0xfe, 0x1a, 0x64, 0x7f, 0x10, 0x88, 0xaa, 0xbe, 0x92, - 0x2e, 0xaa, 0xfc, 0xd7, 0xbf, 0x87, 0x42, 0xfc, 0x89, 0x83, 0x8a, 0x90, 0x3b, 0xe8, 0x7d, 0xd5, - 0x7b, 0x74, 0xd8, 0x2b, 0xa7, 0x50, 0x01, 0x8c, 0xc7, 0x07, 0x5d, 0xfc, 0x6d, 0x59, 0x43, 0x79, - 0xc8, 0xe0, 0x83, 0x87, 0xdd, 0x72, 0x9a, 0x6b, 0xf4, 0x77, 0xef, 0x75, 0xb7, 0x37, 0x71, 0x59, - 0xe7, 0x1a, 0xfd, 0xfd, 0x47, 0xb8, 0x5b, 0xce, 0x70, 0x1c, 0x77, 0xb7, 0xbb, 0xbb, 0x4f, 0xba, - 0x65, 0x83, 0xe3, 0xf7, 0xba, 0x5b, 0x07, 0x0f, 0xca, 0xd9, 0xeb, 0x5b, 0x90, 0xe1, 0xdf, 0x08, - 0x28, 0x07, 0x3a, 0xde, 0x3c, 0x94, 0x56, 0xb7, 0x1f, 0x1d, 0xf4, 0xf6, 0xcb, 0x1a, 0xc7, 0xfa, - 0x07, 0x7b, 0xe5, 0x34, 0x3f, 0xec, 0xed, 0xf6, 0xca, 0xba, 0x38, 0x6c, 0x7e, 0x23, 0xcd, 0x09, - 0xad, 0x2e, 0x2e, 0x1b, 0x9d, 0x1f, 0xd3, 0x60, 0x08, 0x1f, 0xd1, 0xe7, 0x90, 0x11, 0xff, 0x06, - 0x2e, 0x47, 0x75, 0x58, 0xfa, 0xe2, 0xac, 0x56, 0x92, 0xa0, 0xca, 0xdf, 0x17, 0x90, 0x95, 0xbb, - 0x12, 0x5d, 0x49, 0xee, 0xce, 0xe8, 0xda, 0xda, 0x69, 0x58, 0x5e, 0xbc, 0xa9, 0xa1, 0x6d, 0x80, - 0xc5, 0x34, 0xa2, 0xf5, 0x44, 0xed, 0x97, 0x37, 0x62, 0xb5, 0x7a, 0x16, 0xa5, 0xde, 0xbf, 0x0f, - 0xc5, 0xa5, 0xb2, 0xa2, 0xa4, 0x6a, 0x62, 0xe4, 0xaa, 0xd7, 0xce, 0xe4, 0xa4, 0x9d, 0x4e, 0x0f, - 0x4a, 0xe2, 0x1b, 0x9f, 0xcf, 0x92, 0x4c, 0xc6, 0x5d, 0x28, 0x62, 0x32, 0xf3, 0x18, 0x11, 0x38, - 0x8a, 0xc3, 0x5f, 0xfe, 0x29, 0x50, 0xbd, 0x72, 0x0a, 0x55, 0x3f, 0x19, 0x52, 0x5b, 0x9f, 0xbe, - 0xf8, 0xa7, 0x96, 0x7a, 0xf1, 0xba, 0xa6, 0xbd, 0x7c, 0x5d, 0xd3, 0xfe, 0x7e, 0x5d, 0xd3, 0x7e, - 0x7b, 0x53, 0x4b, 0xbd, 0x7c, 0x53, 0x4b, 0xfd, 0xf9, 0xa6, 0x96, 0x7a, 0x9a, 0x53, 0xbf, 0x5a, - 0x86, 0x59, 0xd1, 0x33, 0xb7, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xa0, 0x14, 0xa2, 0x0f, 0x1f, - 0x0d, 0x00, 0x00, + // 1149 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4b, 0x6f, 0x23, 0x45, + 0x10, 0xf6, 0x78, 0x3c, 0x7e, 0x94, 0x13, 0xaf, 0xb7, 0xd7, 0xc9, 0x4e, 0xbc, 0x92, 0x63, 0x8c, + 0x90, 0xac, 0x55, 0xe4, 0xac, 0xbc, 0x08, 0x09, 0xc4, 0x25, 0x09, 0x2c, 0x59, 0x89, 0x04, 0xe8, + 0xec, 0x12, 0x04, 0x87, 0x51, 0xdb, 0xee, 0x8c, 0x47, 0x3b, 0xaf, 0x4c, 0xf7, 0x90, 0xf8, 0x0c, + 0x67, 0xc4, 0x9d, 0xdb, 0xfe, 0x9a, 0xdc, 0xd8, 0x23, 0x27, 0x04, 0xc9, 0x1f, 0x41, 0xfd, 0x18, + 0x3f, 0x82, 0xf7, 0xa5, 0xe4, 0x62, 0x75, 0x7d, 0x5f, 0x75, 0x4d, 0x75, 0xf5, 0x57, 0xe5, 0x86, + 0xfb, 0x8c, 0x47, 0x09, 0xdd, 0x96, 0xbf, 0xf1, 0x60, 0x3b, 0x89, 0x87, 0xbd, 0x38, 0x89, 0x78, + 0x84, 0x8a, 0x7c, 0x4c, 0xc2, 0x88, 0x35, 0x37, 0x16, 0x1d, 0xf8, 0x24, 0xa6, 0x4c, 0xb9, 0x34, + 0x1b, 0x6e, 0xe4, 0x46, 0x72, 0xb9, 0x2d, 0x56, 0x1a, 0x6d, 0x2f, 0x6e, 0x88, 0x93, 0x28, 0xb8, + 0xb6, 0x6f, 0xc3, 0x8d, 0x22, 0xd7, 0xa7, 0xdb, 0xd2, 0x1a, 0xa4, 0x27, 0xdb, 0x24, 0x9c, 0x28, + 0xaa, 0x73, 0x07, 0x56, 0x8f, 0x13, 0x8f, 0x53, 0x4c, 0x59, 0x1c, 0x85, 0x8c, 0x76, 0x7e, 0x31, + 0x60, 0x45, 0x23, 0xa7, 0x29, 0x65, 0x1c, 0xed, 0x00, 0x70, 0x2f, 0xa0, 0x8c, 0x26, 0x1e, 0x65, + 0xb6, 0xd1, 0x36, 0xbb, 0xd5, 0xfe, 0x03, 0xb1, 0x3b, 0xa0, 0x7c, 0x4c, 0x53, 0xe6, 0x0c, 0xa3, + 0x78, 0xd2, 0x7b, 0xe6, 0x05, 0xf4, 0x48, 0xba, 0xec, 0x16, 0x2e, 0xfe, 0xde, 0xcc, 0xe1, 0xb9, + 0x4d, 0x68, 0x1d, 0x8a, 0x9c, 0x86, 0x24, 0xe4, 0x76, 0xbe, 0x6d, 0x74, 0x2b, 0x58, 0x5b, 0xc8, + 0x86, 0x52, 0x42, 0x63, 0xdf, 0x1b, 0x12, 0xdb, 0x6c, 0x1b, 0x5d, 0x13, 0x67, 0x66, 0xe7, 0xa5, + 0x05, 0xab, 0x2a, 0x5c, 0x96, 0xc6, 0x06, 0x94, 0x03, 0x2f, 0x74, 0x44, 0x54, 0xdb, 0x50, 0xce, + 0x81, 0x17, 0x8a, 0xcf, 0x4a, 0x8a, 0x9c, 0x2b, 0x2a, 0xaf, 0x29, 0x72, 0x2e, 0xa9, 0x4f, 0x04, + 0xc5, 0x87, 0x63, 0x9a, 0x30, 0xdb, 0x94, 0xa9, 0x37, 0x7a, 0xaa, 0xce, 0xbd, 0xaf, 0xc9, 0x80, + 0xfa, 0x07, 0x8a, 0xd4, 0x39, 0x4f, 0x7d, 0x51, 0x1f, 0xd6, 0x44, 0xc8, 0x84, 0xb2, 0xc8, 0x4f, + 0xb9, 0x17, 0x85, 0xce, 0x99, 0x17, 0x8e, 0xa2, 0x33, 0xbb, 0x20, 0xe3, 0xdf, 0x0b, 0xc8, 0x39, + 0x9e, 0x72, 0xc7, 0x92, 0x42, 0x5b, 0x00, 0xc4, 0x75, 0x13, 0xea, 0x12, 0x4e, 0x99, 0x6d, 0xb5, + 0xcd, 0x6e, 0xad, 0xbf, 0x92, 0x7d, 0x6d, 0xc7, 0x75, 0x13, 0x3c, 0xc7, 0xa3, 0xcf, 0x60, 0x23, + 0x26, 0x09, 0xf7, 0x88, 0x2f, 0xbe, 0x22, 0x6b, 0xef, 0x8c, 0x3c, 0x46, 0x06, 0x3e, 0x1d, 0xd9, + 0xc5, 0xb6, 0xd1, 0x2d, 0xe3, 0xfb, 0xda, 0x21, 0xbb, 0x9b, 0x2f, 0x34, 0x8d, 0x7e, 0x5a, 0xb2, + 0x97, 0xf1, 0x84, 0x70, 0xea, 0x4e, 0xec, 0x52, 0xdb, 0xe8, 0xd6, 0xfa, 0x9b, 0xd9, 0x87, 0xbf, + 0x5d, 0x8c, 0x71, 0xa4, 0xdd, 0xfe, 0x17, 0x3c, 0x23, 0xd0, 0x26, 0x54, 0xd9, 0x0b, 0x2f, 0x76, + 0x86, 0xe3, 0x34, 0x7c, 0xc1, 0xec, 0xb2, 0x4c, 0x05, 0x04, 0xb4, 0x27, 0x11, 0xf4, 0x10, 0xac, + 0xb1, 0x17, 0x72, 0x66, 0x57, 0xda, 0x86, 0x2c, 0xa8, 0x52, 0x57, 0x2f, 0x53, 0x57, 0x6f, 0x27, + 0x9c, 0x60, 0xe5, 0x82, 0x10, 0x14, 0x18, 0xa7, 0xb1, 0x0d, 0xb2, 0x6c, 0x72, 0x8d, 0x1a, 0x60, + 0x25, 0x24, 0x74, 0xa9, 0x5d, 0x95, 0xa0, 0x32, 0xd0, 0x63, 0xa8, 0x9e, 0xa6, 0x34, 0x99, 0x38, + 0x2a, 0xf6, 0x8a, 0x8c, 0x8d, 0xb2, 0x53, 0x7c, 0x27, 0xa8, 0x7d, 0xc1, 0x60, 0x38, 0x9d, 0xae, + 0xd1, 0x23, 0x00, 0x36, 0x26, 0xc9, 0xc8, 0xf1, 0xc2, 0x93, 0xc8, 0x5e, 0x95, 0x7b, 0xee, 0x66, + 0x7b, 0x8e, 0x04, 0xf3, 0x34, 0x3c, 0x89, 0x70, 0x85, 0x65, 0x4b, 0xf4, 0x31, 0xac, 0x9f, 0x79, + 0x7c, 0x1c, 0xa5, 0xdc, 0xd1, 0x5a, 0x73, 0x7c, 0x21, 0x04, 0x66, 0xd7, 0xda, 0x66, 0xb7, 0x82, + 0x1b, 0x9a, 0xc5, 0x8a, 0x94, 0x22, 0x61, 0x22, 0x65, 0xdf, 0x0b, 0x3c, 0x6e, 0xdf, 0x51, 0x29, + 0x4b, 0xa3, 0xf3, 0xd2, 0x00, 0x98, 0x25, 0x26, 0x0b, 0xc7, 0x69, 0xec, 0x04, 0x9e, 0xef, 0x7b, + 0x4c, 0x8b, 0x14, 0x04, 0x74, 0x20, 0x11, 0xd4, 0x86, 0xc2, 0x49, 0x1a, 0x0e, 0xa5, 0x46, 0xab, + 0x33, 0x69, 0x3c, 0x49, 0xc3, 0x21, 0x96, 0x0c, 0xda, 0x82, 0xb2, 0x9b, 0x44, 0x69, 0xec, 0x85, + 0xae, 0x54, 0x5a, 0xb5, 0x5f, 0xcf, 0xbc, 0xbe, 0xd2, 0x38, 0x9e, 0x7a, 0xa0, 0x0f, 0xb3, 0x42, + 0x5a, 0xd2, 0x75, 0x35, 0x73, 0xc5, 0x02, 0xd4, 0x75, 0xed, 0x9c, 0x41, 0x65, 0x5a, 0x08, 0x99, + 0xa2, 0xae, 0xd7, 0x88, 0x9e, 0x4f, 0x53, 0x54, 0xfc, 0x88, 0x9e, 0xa3, 0x0f, 0x60, 0x85, 0x47, + 0x9c, 0xf8, 0x8e, 0xc4, 0x98, 0x6e, 0xa7, 0xaa, 0xc4, 0x64, 0x18, 0x86, 0x6a, 0x90, 0x1f, 0x4c, + 0x64, 0xbf, 0x96, 0x71, 0x7e, 0x30, 0x11, 0xcd, 0xad, 0x2b, 0x58, 0x90, 0x15, 0xd4, 0x56, 0xa7, + 0x09, 0x05, 0x71, 0x32, 0x21, 0x81, 0x90, 0xe8, 0xa6, 0xad, 0x60, 0xb9, 0xee, 0xf4, 0xa1, 0x9c, + 0x9d, 0x47, 0xc7, 0x33, 0x96, 0xc4, 0x33, 0x17, 0xe2, 0x6d, 0x82, 0x25, 0x0f, 0x26, 0x1c, 0x16, + 0x4a, 0xac, 0xad, 0xce, 0x6f, 0x06, 0xd4, 0xb2, 0x99, 0xa1, 0x34, 0x8d, 0xba, 0x50, 0x9c, 0xce, + 0x2d, 0x51, 0xa2, 0xda, 0x54, 0x1b, 0x12, 0xdd, 0xcf, 0x61, 0xcd, 0xa3, 0x26, 0x94, 0xce, 0x48, + 0x12, 0x8a, 0xc2, 0xcb, 0x19, 0xb5, 0x9f, 0xc3, 0x19, 0x80, 0xb6, 0x32, 0xc1, 0x9b, 0xaf, 0x17, + 0xfc, 0x7e, 0x4e, 0x4b, 0x7e, 0xb7, 0x0c, 0xc5, 0x84, 0xb2, 0xd4, 0xe7, 0x9d, 0x5f, 0x4d, 0xb8, + 0x2b, 0x05, 0x74, 0x48, 0x82, 0xd9, 0x20, 0x7b, 0x63, 0xe3, 0x1b, 0x37, 0x68, 0xfc, 0xfc, 0x0d, + 0x1b, 0xbf, 0x01, 0x16, 0xe3, 0x24, 0xe1, 0x7a, 0x16, 0x2b, 0x03, 0xd5, 0xc1, 0xa4, 0xe1, 0x48, + 0xcf, 0x3d, 0xb1, 0x9c, 0xf5, 0xbf, 0xf5, 0xf6, 0xfe, 0x9f, 0x9f, 0xbf, 0xc5, 0xf7, 0x98, 0xbf, + 0xaf, 0x6f, 0xd3, 0xd2, 0xbb, 0xb4, 0x69, 0x79, 0xbe, 0x4d, 0x13, 0x40, 0xf3, 0xb7, 0xa0, 0xa5, + 0xd1, 0x00, 0x4b, 0x48, 0x51, 0xfd, 0xa3, 0x55, 0xb0, 0x32, 0x50, 0x13, 0xca, 0xfa, 0xd6, 0x85, + 0xf6, 0x05, 0x31, 0xb5, 0x67, 0xe7, 0x36, 0xdf, 0x7a, 0xee, 0xce, 0x1f, 0xa6, 0xfe, 0xe8, 0xf7, + 0xc4, 0x4f, 0x67, 0x77, 0x2f, 0x12, 0x14, 0xa8, 0x6e, 0x06, 0x65, 0xbc, 0x59, 0x11, 0xf9, 0x1b, + 0x28, 0xc2, 0xbc, 0x2d, 0x45, 0x14, 0x96, 0x28, 0xc2, 0x5a, 0xa2, 0x88, 0xe2, 0xfb, 0x29, 0xa2, + 0x74, 0x2b, 0x8a, 0x28, 0xbf, 0x8b, 0x22, 0x2a, 0xf3, 0x8a, 0x48, 0xe1, 0xde, 0xc2, 0xe5, 0x68, + 0x49, 0xac, 0x43, 0xf1, 0x67, 0x89, 0x68, 0x4d, 0x68, 0xeb, 0xb6, 0x44, 0xf1, 0x70, 0x17, 0x0a, + 0xe2, 0x19, 0x80, 0x4a, 0x60, 0xe2, 0x9d, 0xe3, 0x7a, 0x0e, 0x55, 0xc0, 0xda, 0xfb, 0xe6, 0xf9, + 0xe1, 0xb3, 0xba, 0x21, 0xb0, 0xa3, 0xe7, 0x07, 0xf5, 0xbc, 0x58, 0x1c, 0x3c, 0x3d, 0xac, 0x9b, + 0x72, 0xb1, 0xf3, 0x43, 0xbd, 0x80, 0xaa, 0x50, 0x92, 0x5e, 0x5f, 0xe2, 0xba, 0xd5, 0xff, 0xd3, + 0x00, 0xeb, 0x48, 0xbc, 0xf4, 0xd0, 0xa7, 0x50, 0x54, 0x53, 0x0c, 0xad, 0x2d, 0x4e, 0x35, 0x2d, + 0xb6, 0xe6, 0xfa, 0x75, 0x58, 0x1d, 0xf3, 0x91, 0x81, 0xf6, 0x00, 0x66, 0x1d, 0x81, 0x36, 0x16, + 0xea, 0x3f, 0x3f, 0xab, 0x9a, 0xcd, 0x65, 0x94, 0xae, 0xd6, 0x13, 0xa8, 0xce, 0x15, 0x11, 0x2d, + 0xba, 0x2e, 0xc8, 0xbe, 0xf9, 0x60, 0x29, 0xa7, 0xe2, 0xf4, 0x0f, 0xa1, 0x26, 0xdf, 0x9b, 0x42, + 0xcf, 0xea, 0x64, 0x9f, 0x43, 0x15, 0xd3, 0x20, 0xe2, 0x54, 0xe2, 0x68, 0xaa, 0x8f, 0xf9, 0x67, + 0x69, 0x73, 0xed, 0x1a, 0xaa, 0x9f, 0xaf, 0xb9, 0xdd, 0x8f, 0x2e, 0xfe, 0x6d, 0xe5, 0x2e, 0x2e, + 0x5b, 0xc6, 0xab, 0xcb, 0x96, 0xf1, 0xcf, 0x65, 0xcb, 0xf8, 0xfd, 0xaa, 0x95, 0x7b, 0x75, 0xd5, + 0xca, 0xfd, 0x75, 0xd5, 0xca, 0xfd, 0x58, 0xd2, 0xcf, 0xe4, 0x41, 0x51, 0xde, 0xd0, 0xe3, 0xff, + 0x02, 0x00, 0x00, 0xff, 0xff, 0x84, 0xe1, 0x09, 0x34, 0x90, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -949,10 +815,6 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type StoreClient interface { - /// Info returns meta information about a store e.g labels that makes that store unique as well as time range that is - /// available. - /// Deprecated. Use `thanos.info` instead. - Info(ctx context.Context, in *InfoRequest, opts ...grpc.CallOption) (*InfoResponse, error) /// Series streams each Series (Labels and chunk/downsampling chunk) for given label matchers and time range. /// /// Series should strictly stream full series after series, optionally split by time. This means that a single frame can contain @@ -962,6 +824,9 @@ type StoreClient interface { /// /// There is no requirements on chunk sorting, however it is recommended to have chunk sorted by chunk min time. /// This heavily optimizes the resource usage on Querier / Federated Queries. + /// + /// Chunks can span a range larger than the requested min and max time and it is up to the query engine to discard samples + /// which fall outside of the query range. Series(ctx context.Context, in *SeriesRequest, opts ...grpc.CallOption) (Store_SeriesClient, error) /// LabelNames returns all label names constrained by the given matchers. LabelNames(ctx context.Context, in *LabelNamesRequest, opts ...grpc.CallOption) (*LabelNamesResponse, error) @@ -977,15 +842,6 @@ func NewStoreClient(cc *grpc.ClientConn) StoreClient { return &storeClient{cc} } -func (c *storeClient) Info(ctx context.Context, in *InfoRequest, opts ...grpc.CallOption) (*InfoResponse, error) { - out := new(InfoResponse) - err := c.cc.Invoke(ctx, "/thanos.Store/Info", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *storeClient) Series(ctx context.Context, in *SeriesRequest, opts ...grpc.CallOption) (Store_SeriesClient, error) { stream, err := c.cc.NewStream(ctx, &_Store_serviceDesc.Streams[0], "/thanos.Store/Series", opts...) if err != nil { @@ -1038,10 +894,6 @@ func (c *storeClient) LabelValues(ctx context.Context, in *LabelValuesRequest, o // StoreServer is the server API for Store service. type StoreServer interface { - /// Info returns meta information about a store e.g labels that makes that store unique as well as time range that is - /// available. - /// Deprecated. Use `thanos.info` instead. - Info(context.Context, *InfoRequest) (*InfoResponse, error) /// Series streams each Series (Labels and chunk/downsampling chunk) for given label matchers and time range. /// /// Series should strictly stream full series after series, optionally split by time. This means that a single frame can contain @@ -1051,6 +903,9 @@ type StoreServer interface { /// /// There is no requirements on chunk sorting, however it is recommended to have chunk sorted by chunk min time. /// This heavily optimizes the resource usage on Querier / Federated Queries. + /// + /// Chunks can span a range larger than the requested min and max time and it is up to the query engine to discard samples + /// which fall outside of the query range. Series(*SeriesRequest, Store_SeriesServer) error /// LabelNames returns all label names constrained by the given matchers. LabelNames(context.Context, *LabelNamesRequest) (*LabelNamesResponse, error) @@ -1062,9 +917,6 @@ type StoreServer interface { type UnimplementedStoreServer struct { } -func (*UnimplementedStoreServer) Info(ctx context.Context, req *InfoRequest) (*InfoResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Info not implemented") -} func (*UnimplementedStoreServer) Series(req *SeriesRequest, srv Store_SeriesServer) error { return status.Errorf(codes.Unimplemented, "method Series not implemented") } @@ -1079,24 +931,6 @@ func RegisterStoreServer(s *grpc.Server, srv StoreServer) { s.RegisterService(&_Store_serviceDesc, srv) } -func _Store_Info_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(InfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(StoreServer).Info(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/thanos.Store/Info", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(StoreServer).Info(ctx, req.(*InfoRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Store_Series_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(SeriesRequest) if err := stream.RecvMsg(m); err != nil { @@ -1158,10 +992,6 @@ var _Store_serviceDesc = grpc.ServiceDesc{ ServiceName: "thanos.Store", HandlerType: (*StoreServer)(nil), Methods: []grpc.MethodDesc{ - { - MethodName: "Info", - Handler: _Store_Info_Handler, - }, { MethodName: "LabelNames", Handler: _Store_LabelNames_Handler, @@ -1327,95 +1157,6 @@ func (m *WriteRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *InfoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *InfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *InfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *InfoResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *InfoResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *InfoResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.LabelSets) > 0 { - for iNdEx := len(m.LabelSets) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.LabelSets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintRpc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - } - if m.StoreType != 0 { - i = encodeVarintRpc(dAtA, i, uint64(m.StoreType)) - i-- - dAtA[i] = 0x20 - } - if m.MaxTime != 0 { - i = encodeVarintRpc(dAtA, i, uint64(m.MaxTime)) - i-- - dAtA[i] = 0x18 - } - if m.MinTime != 0 { - i = encodeVarintRpc(dAtA, i, uint64(m.MinTime)) - i-- - dAtA[i] = 0x10 - } - if len(m.Labels) > 0 { - for iNdEx := len(m.Labels) - 1; iNdEx >= 0; iNdEx-- { - { - size := m.Labels[iNdEx].Size() - i -= size - if _, err := m.Labels[iNdEx].MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintRpc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *SeriesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1436,6 +1177,11 @@ func (m *SeriesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Limit != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x78 + } if len(m.WithoutReplicaLabels) > 0 { for iNdEx := len(m.WithoutReplicaLabels) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.WithoutReplicaLabels[iNdEx]) @@ -1890,6 +1636,11 @@ func (m *LabelNamesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Limit != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x40 + } if len(m.WithoutReplicaLabels) > 0 { for iNdEx := len(m.WithoutReplicaLabels) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.WithoutReplicaLabels[iNdEx]) @@ -2026,6 +1777,11 @@ func (m *LabelValuesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Limit != 0 { + i = encodeVarintRpc(dAtA, i, uint64(m.Limit)) + i-- + dAtA[i] = 0x48 + } if len(m.WithoutReplicaLabels) > 0 { for iNdEx := len(m.WithoutReplicaLabels) - 1; iNdEx >= 0; iNdEx-- { i -= len(m.WithoutReplicaLabels[iNdEx]) @@ -2191,45 +1947,6 @@ func (m *WriteRequest) Size() (n int) { return n } -func (m *InfoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *InfoResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Labels) > 0 { - for _, e := range m.Labels { - l = e.Size() - n += 1 + l + sovRpc(uint64(l)) - } - } - if m.MinTime != 0 { - n += 1 + sovRpc(uint64(m.MinTime)) - } - if m.MaxTime != 0 { - n += 1 + sovRpc(uint64(m.MaxTime)) - } - if m.StoreType != 0 { - n += 1 + sovRpc(uint64(m.StoreType)) - } - if len(m.LabelSets) > 0 { - for _, e := range m.LabelSets { - l = e.Size() - n += 1 + l + sovRpc(uint64(l)) - } - } - return n -} - func (m *SeriesRequest) Size() (n int) { if m == nil { return 0 @@ -2291,6 +2008,9 @@ func (m *SeriesRequest) Size() (n int) { n += 1 + l + sovRpc(uint64(l)) } } + if m.Limit != 0 { + n += 1 + sovRpc(uint64(m.Limit)) + } return n } @@ -2465,6 +2185,9 @@ func (m *LabelNamesRequest) Size() (n int) { n += 1 + l + sovRpc(uint64(l)) } } + if m.Limit != 0 { + n += 1 + sovRpc(uint64(m.Limit)) + } return n } @@ -2531,6 +2254,9 @@ func (m *LabelValuesRequest) Size() (n int) { n += 1 + l + sovRpc(uint64(l)) } } + if m.Limit != 0 { + n += 1 + sovRpc(uint64(m.Limit)) + } return n } @@ -2750,231 +2476,6 @@ func (m *WriteRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *InfoRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRpc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: InfoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: InfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipRpc(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRpc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *InfoResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRpc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: InfoResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: InfoResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRpc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRpc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRpc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Labels = append(m.Labels, github_com_thanos_io_thanos_pkg_store_labelpb.ZLabel{}) - if err := m.Labels[len(m.Labels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MinTime", wireType) - } - m.MinTime = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRpc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MinTime |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxTime", wireType) - } - m.MaxTime = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRpc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxTime |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StoreType", wireType) - } - m.StoreType = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRpc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.StoreType |= StoreType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LabelSets", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowRpc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthRpc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthRpc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.LabelSets = append(m.LabelSets, labelpb.ZLabelSet{}) - if err := m.LabelSets[len(m.LabelSets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipRpc(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthRpc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *SeriesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3401,6 +2902,25 @@ func (m *SeriesRequest) Unmarshal(dAtA []byte) error { } m.WithoutReplicaLabels = append(m.WithoutReplicaLabels, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) @@ -4352,6 +3872,25 @@ func (m *LabelNamesRequest) Unmarshal(dAtA []byte) error { } m.WithoutReplicaLabels = append(m.WithoutReplicaLabels, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) @@ -4763,6 +4302,25 @@ func (m *LabelValuesRequest) Unmarshal(dAtA []byte) error { } m.WithoutReplicaLabels = append(m.WithoutReplicaLabels, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType) + } + m.Limit = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Limit |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipRpc(dAtA[iNdEx:]) diff --git a/pkg/store/storepb/rpc.proto b/pkg/store/storepb/rpc.proto index 2a9e9e3eaf..2de086bc12 100644 --- a/pkg/store/storepb/rpc.proto +++ b/pkg/store/storepb/rpc.proto @@ -7,7 +7,6 @@ package thanos; import "store/storepb/types.proto"; import "gogoproto/gogo.proto"; import "store/storepb/prompb/types.proto"; -import "store/labelpb/types.proto"; import "google/protobuf/any.proto"; option go_package = "storepb"; @@ -25,11 +24,6 @@ option (gogoproto.goproto_sizecache_all) = false; /// Store represents API against instance that stores XOR encoded values with label set metadata (e.g Prometheus metrics). service Store { - /// Info returns meta information about a store e.g labels that makes that store unique as well as time range that is - /// available. - /// Deprecated. Use `thanos.info` instead. - rpc Info(InfoRequest) returns (InfoResponse); - /// Series streams each Series (Labels and chunk/downsampling chunk) for given label matchers and time range. /// /// Series should strictly stream full series after series, optionally split by time. This means that a single frame can contain @@ -39,6 +33,9 @@ service Store { /// /// There is no requirements on chunk sorting, however it is recommended to have chunk sorted by chunk min time. /// This heavily optimizes the resource usage on Querier / Federated Queries. + /// + /// Chunks can span a range larger than the requested min and max time and it is up to the query engine to discard samples + /// which fall outside of the query range. rpc Series(SeriesRequest) returns (stream SeriesResponse); /// LabelNames returns all label names constrained by the given matchers. @@ -63,32 +60,6 @@ message WriteRequest { int64 replica = 3; } -// Deprecated. Use `thanos.info` instead. -message InfoRequest {} - -// Deprecated. Use `thanos.info` instead. -enum StoreType { - UNKNOWN = 0; - QUERY = 1; - RULE = 2; - SIDECAR = 3; - STORE = 4; - RECEIVE = 5; - // DEBUG represents some debug StoreAPI components e.g. thanos tools store-api-serve. - DEBUG = 6; -} - -// Deprecated. Use `thanos.info` instead. -message InfoResponse { - // Deprecated. Use label_sets instead. - repeated Label labels = 1 [(gogoproto.nullable) = false, (gogoproto.customtype) = "github.com/thanos-io/thanos/pkg/store/labelpb.ZLabel"]; - int64 min_time = 2; - int64 max_time = 3; - StoreType storeType = 4; - // label_sets is an unsorted list of `ZLabelSet`s. - repeated ZLabelSet label_sets = 5 [(gogoproto.nullable) = false]; -} - message SeriesRequest { int64 min_time = 1; int64 max_time = 2; @@ -137,6 +108,9 @@ message SeriesRequest { // NOTE(bwplotka): thanos.info.store.supports_without_replica_labels field has to return true to let client knows // server supports it. repeated string without_replica_labels = 14; + + // limit is used to limit the number of results returned + int64 limit = 15; } // QueryHints represents hints from PromQL that might help to @@ -235,6 +209,9 @@ message LabelNamesRequest { // same as in series request. repeated string without_replica_labels = 7; + + // limit is used to limit the number of results returned + int64 limit = 8; } message LabelNamesResponse { @@ -268,6 +245,9 @@ message LabelValuesRequest { // same as in series request. repeated string without_replica_labels = 8; + + // limit is used to limit the number of results returned + int64 limit = 9; } message LabelValuesResponse { diff --git a/pkg/store/storepb/testutil/client.go b/pkg/store/storepb/testutil/client.go index 90874842d6..664819a1a2 100644 --- a/pkg/store/storepb/testutil/client.go +++ b/pkg/store/storepb/testutil/client.go @@ -21,12 +21,14 @@ type TestClient struct { WithoutReplicaLabelsEnabled bool IsLocalStore bool StoreTSDBInfos []infopb.TSDBInfo + StoreFilterNotMatches bool } -func (c TestClient) LabelSets() []labels.Labels { return c.ExtLset } -func (c TestClient) TimeRange() (mint, maxt int64) { return c.MinTime, c.MaxTime } -func (c TestClient) TSDBInfos() []infopb.TSDBInfo { return c.StoreTSDBInfos } -func (c TestClient) SupportsSharding() bool { return c.Shardable } -func (c TestClient) SupportsWithoutReplicaLabels() bool { return c.WithoutReplicaLabelsEnabled } -func (c TestClient) String() string { return c.Name } -func (c TestClient) Addr() (string, bool) { return c.Name, c.IsLocalStore } +func (c TestClient) LabelSets() []labels.Labels { return c.ExtLset } +func (c TestClient) TimeRange() (mint, maxt int64) { return c.MinTime, c.MaxTime } +func (c TestClient) TSDBInfos() []infopb.TSDBInfo { return c.StoreTSDBInfos } +func (c TestClient) SupportsSharding() bool { return c.Shardable } +func (c TestClient) SupportsWithoutReplicaLabels() bool { return c.WithoutReplicaLabelsEnabled } +func (c TestClient) String() string { return c.Name } +func (c TestClient) Addr() (string, bool) { return c.Name, c.IsLocalStore } +func (c TestClient) Matches(matches []*labels.Matcher) bool { return !c.StoreFilterNotMatches } diff --git a/pkg/store/storepb/testutil/series.go b/pkg/store/storepb/testutil/series.go index c5c4896bd7..bdb8a33fee 100644 --- a/pkg/store/storepb/testutil/series.go +++ b/pkg/store/storepb/testutil/series.go @@ -68,9 +68,10 @@ func CreateBlockFromHead(t testing.TB, dir string, head *tsdb.Head) ulid.ULID { // Add +1 millisecond to block maxt because block intervals are half-open: [b.MinTime, b.MaxTime). // Because of this block intervals are always +1 than the total samples it includes. - ulid, err := compactor.Write(dir, head, head.MinTime(), head.MaxTime()+1, nil) + ulids, err := compactor.Write(dir, head, head.MinTime(), head.MaxTime()+1, nil) testutil.Ok(t, err) - return ulid + testutil.Assert(t, len(ulids) > 0) + return ulids[0] } // CreateHeadWithSeries returns head filled with given samples and same series returned in separate list for assertion purposes. @@ -363,7 +364,7 @@ func TestServerSeries(t testutil.TB, store storepb.StoreServer, cases ...*Series // Huge responses can produce unreadable diffs - make it more human readable. if len(c.ExpectedSeries) > 4 { for j := range c.ExpectedSeries { - testutil.Equals(t, c.ExpectedSeries[j].Labels, srv.SeriesSet[j].Labels, "%v series chunks mismatch", j) + testutil.Equals(t, c.ExpectedSeries[j].Labels, srv.SeriesSet[j].Labels) // Check chunks when it is not a skip chunk query if !c.Req.SkipChunks { @@ -376,7 +377,10 @@ func TestServerSeries(t testutil.TB, store storepb.StoreServer, cases ...*Series } } } else { - testutil.Equals(t, c.ExpectedSeries, srv.SeriesSet) + testutil.Equals(t, true, len(c.ExpectedSeries) == len(srv.SeriesSet)) + for i := range c.ExpectedSeries { + testutil.Equals(t, c.ExpectedSeries[i], srv.SeriesSet[i]) + } } var actualHints []hintspb.SeriesResponseHints diff --git a/pkg/store/storepb/testutil/store_series_client.go b/pkg/store/storepb/testutil/store_series_client.go index 3647901500..e370f7c984 100644 --- a/pkg/store/storepb/testutil/store_series_client.go +++ b/pkg/store/storepb/testutil/store_series_client.go @@ -41,6 +41,7 @@ func (c *StoreSeriesClient) Recv() (*storepb.SeriesResponse, error) { return nil, io.EOF } s := c.RespSet[c.i] + c.i++ return s, nil @@ -49,3 +50,4 @@ func (c *StoreSeriesClient) Recv() (*storepb.SeriesResponse, error) { func (c *StoreSeriesClient) Context() context.Context { return c.Ctx } +func (c *StoreSeriesClient) CloseSend() error { return nil } diff --git a/pkg/store/tsdb.go b/pkg/store/tsdb.go index 6985c716fa..737fee3bbd 100644 --- a/pkg/store/tsdb.go +++ b/pkg/store/tsdb.go @@ -11,9 +11,12 @@ import ( "sort" "strings" "sync" + "time" "github.com/go-kit/log" + "github.com/go-kit/log/level" "github.com/pkg/errors" + "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/storage" "google.golang.org/grpc" @@ -21,19 +24,35 @@ import ( "google.golang.org/grpc/status" "github.com/thanos-io/thanos/pkg/component" + "github.com/thanos-io/thanos/pkg/filter" "github.com/thanos-io/thanos/pkg/info/infopb" "github.com/thanos-io/thanos/pkg/runutil" "github.com/thanos-io/thanos/pkg/store/labelpb" "github.com/thanos-io/thanos/pkg/store/storepb" ) -const RemoteReadFrameLimit = 1048576 +const ( + RemoteReadFrameLimit = 1048576 + cuckooStoreFilterCapacity = 1000000 + storeFilterUpdateInterval = 15 * time.Second +) type TSDBReader interface { storage.ChunkQueryable StartTime() (int64, error) } +// TSDBStoreOption is a functional option for TSDBStore. +type TSDBStoreOption func(s *TSDBStore) + +// WithCuckooMetricNameStoreFilter returns a TSDBStoreOption that enables the Cuckoo filter for metric names. +func WithCuckooMetricNameStoreFilter() TSDBStoreOption { + return func(s *TSDBStore) { + s.storeFilter = filter.NewCuckooMetricNameStoreFilter(cuckooStoreFilterCapacity) + s.startStoreFilterUpdate = true + } +} + // TSDBStore implements the store API against a local TSDB instance. // It attaches the provided external labels to all results. It only responds with raw data // and does not support downsampling. @@ -44,8 +63,16 @@ type TSDBStore struct { buffers sync.Pool maxBytesPerFrame int - extLset labels.Labels - mtx sync.RWMutex + extLset labels.Labels + startStoreFilterUpdate bool + storeFilter filter.StoreFilter + mtx sync.RWMutex + close func() + storepb.UnimplementedStoreServer +} + +func (s *TSDBStore) Close() { + s.close() } func RegisterWritableStoreServer(storeSrv storepb.WriteableStoreServer) func(*grpc.Server) { @@ -62,21 +89,68 @@ type ReadWriteTSDBStore struct { // NewTSDBStore creates a new TSDBStore. // NOTE: Given lset has to be sorted. -func NewTSDBStore(logger log.Logger, db TSDBReader, component component.StoreAPI, extLset labels.Labels) *TSDBStore { +func NewTSDBStore( + logger log.Logger, + db TSDBReader, + component component.StoreAPI, + extLset labels.Labels, + options ...TSDBStoreOption, +) *TSDBStore { if logger == nil { logger = log.NewNopLogger() } - return &TSDBStore{ + + st := &TSDBStore{ logger: logger, db: db, component: component, extLset: extLset, maxBytesPerFrame: RemoteReadFrameLimit, + storeFilter: filter.AllowAllStoreFilter{}, + close: func() {}, buffers: sync.Pool{New: func() interface{} { b := make([]byte, 0, initialBufSize) return &b }}, } + + for _, option := range options { + option(st) + } + + if st.startStoreFilterUpdate { + ctx, cancel := context.WithCancel(context.Background()) + + updateFilter := func(ctx context.Context) { + vals, err := st.LabelValues(ctx, &storepb.LabelValuesRequest{ + Label: model.MetricNameLabel, + End: math.MaxInt64, + }) + if err != nil { + level.Error(logger).Log("msg", "failed to update metric names", "err", err) + return + } + + st.storeFilter.ResetAndSet(vals.Values...) + } + st.close = cancel + updateFilter(ctx) + + t := time.NewTicker(storeFilterUpdateInterval) + + go func() { + for { + select { + case <-t.C: + updateFilter(ctx) + case <-ctx.Done(): + return + } + } + }() + } + + return st } func (s *TSDBStore) SetExtLset(extLset labels.Labels) { @@ -93,38 +167,11 @@ func (s *TSDBStore) getExtLset() labels.Labels { return s.extLset } -// Info returns store information about the Prometheus instance. -func (s *TSDBStore) Info(_ context.Context, _ *storepb.InfoRequest) (*storepb.InfoResponse, error) { - minTime, err := s.db.StartTime() - if err != nil { - return nil, errors.Wrap(err, "TSDB min Time") - } - - res := &storepb.InfoResponse{ - Labels: labelpb.ZLabelsFromPromLabels(s.getExtLset()), - StoreType: s.component.ToProto(), - MinTime: minTime, - MaxTime: math.MaxInt64, - } - - // Until we deprecate the single labels in the reply, we just duplicate - // them here for migration/compatibility purposes. - res.LabelSets = []labelpb.ZLabelSet{} - if len(res.Labels) > 0 { - res.LabelSets = append(res.LabelSets, labelpb.ZLabelSet{ - Labels: res.Labels, - }) - } - return res, nil -} - func (s *TSDBStore) LabelSet() []labelpb.ZLabelSet { - labels := labelpb.ZLabelsFromPromLabels(s.getExtLset()) + labels := labelpb.ZLabelSetsFromPromLabels(s.getExtLset()) labelSets := []labelpb.ZLabelSet{} if len(labels) > 0 { - labelSets = append(labelSets, labelpb.ZLabelSet{ - Labels: labels, - }) + labelSets = append(labelSets, labels...) } return labelSets @@ -160,16 +207,45 @@ func (s *TSDBStore) TimeRange() (int64, int64) { return minTime, math.MaxInt64 } +func (s *TSDBStore) Matches(matchers []*labels.Matcher) bool { + return s.storeFilter.Matches(matchers) +} + // CloseDelegator allows to delegate close (releasing resources used by request to the server). // This is useful when we invoke StoreAPI within another StoreAPI and results are ephemeral until copied. type CloseDelegator interface { Delegate(io.Closer) } +type noopUpstream struct { + ctx context.Context + storepb.Store_SeriesServer +} + +func (n *noopUpstream) Context() context.Context { + return n.ctx +} + +func (s *TSDBStore) SeriesLocal(ctx context.Context, r *storepb.SeriesRequest) ([]*storepb.Series, error) { + srv := newFlushableServer(&noopUpstream{ctx: ctx}, sortingStrategyStoreSendNoop) + if err := s.Series(r, srv); err != nil { + return nil, err + } + + rs := srv.(*resortingServer) + + return rs.series, nil +} + // Series returns all series for a requested time range and label matcher. The returned data may // exceed the requested time bounds. func (s *TSDBStore) Series(r *storepb.SeriesRequest, seriesSrv storepb.Store_SeriesServer) error { - srv := newFlushableServer(seriesSrv, sortingStrategyStore) + var srv flushableServer + if fs, ok := seriesSrv.(flushableServer); !ok { + srv = newFlushableServer(seriesSrv, sortingStrategyStore) + } else { + srv = fs + } match, matchers, err := matchesExternalLabels(r.Matchers, s.getExtLset()) if err != nil { @@ -195,7 +271,13 @@ func (s *TSDBStore) Series(r *storepb.SeriesRequest, seriesSrv storepb.Store_Ser defer runutil.CloseWithLogOnErr(s.logger, q, "close tsdb chunk querier series") } - set := q.Select(srv.Context(), true, nil, matchers...) + hints := &storage.SelectHints{ + Start: r.MinTime, + End: r.MaxTime, + Limit: int(r.Limit), + DisableTrimming: true, + } + set := q.Select(srv.Context(), true, hints, matchers...) shardMatcher := r.ShardInfo.Matcher(&s.buffers) defer shardMatcher.Close() @@ -303,7 +385,10 @@ func (s *TSDBStore) LabelNames(ctx context.Context, r *storepb.LabelNamesRequest } defer runutil.CloseWithLogOnErr(s.logger, q, "close tsdb querier label names") - res, _, err := q.LabelNames(ctx, matchers...) + hints := &storage.LabelHints{ + Limit: int(r.Limit), + } + res, _, err := q.LabelNames(ctx, hints, matchers...) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } @@ -371,6 +456,7 @@ func (s *TSDBStore) LabelValues(ctx context.Context, r *storepb.LabelValuesReque Start: r.Start, End: r.End, Func: "series", + Limit: int(r.Limit), } set := q.Select(ctx, false, hints, matchers...) @@ -380,7 +466,10 @@ func (s *TSDBStore) LabelValues(ctx context.Context, r *storepb.LabelValuesReque return &storepb.LabelValuesResponse{}, nil } - res, _, err := q.LabelValues(ctx, r.Label, matchers...) + hints := &storage.LabelHints{ + Limit: int(r.Limit), + } + res, _, err := q.LabelValues(ctx, r.Label, hints, matchers...) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } diff --git a/pkg/store/tsdb_selector.go b/pkg/store/tsdb_selector.go index c9beef6e77..463ab96b14 100644 --- a/pkg/store/tsdb_selector.go +++ b/pkg/store/tsdb_selector.go @@ -69,13 +69,13 @@ func MatchersForLabelSets(labelSets []labels.Labels) []storepb.LabelMatcher { labelNameValues = make(map[string]map[string]struct{}) ) for _, labelSet := range labelSets { - for _, lbl := range labelSet { - if _, ok := labelNameValues[lbl.Name]; !ok { - labelNameValues[lbl.Name] = make(map[string]struct{}) + labelSet.Range(func(l labels.Label) { + if _, ok := labelNameValues[l.Name]; !ok { + labelNameValues[l.Name] = make(map[string]struct{}) } - labelNameCounts[lbl.Name]++ - labelNameValues[lbl.Name][lbl.Value] = struct{}{} - } + labelNameCounts[l.Name]++ + labelNameValues[l.Name][l.Value] = struct{}{} + }) } // If a label name is missing from a label set, force an empty value matcher for diff --git a/pkg/store/tsdb_selector_test.go b/pkg/store/tsdb_selector_test.go index cb3e0c07b4..ea4d1e8c36 100644 --- a/pkg/store/tsdb_selector_test.go +++ b/pkg/store/tsdb_selector_test.go @@ -14,6 +14,8 @@ import ( ) func TestMatchersForLabelSets(t *testing.T) { + t.Parallel() + tests := []struct { name string labelSets []labels.Labels @@ -26,29 +28,28 @@ func TestMatchersForLabelSets(t *testing.T) { }, { name: "single label set with single label", - labelSets: []labels.Labels{{ - labels.Label{Name: "a", Value: "1"}, - }}, + labelSets: []labels.Labels{ + labels.FromStrings("a", "1"), + }, want: []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_RE, Name: "a", Value: "1"}, }, }, { name: "multiple labels with same label name", - labelSets: []labels.Labels{{ - labels.Label{Name: "a", Value: "1"}, - labels.Label{Name: "a", Value: "2"}, - }}, + labelSets: []labels.Labels{ + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, want: []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_RE, Name: "a", Value: "1|2"}, }, }, { name: "multiple labels with different label name", - labelSets: []labels.Labels{{ - labels.Label{Name: "a", Value: "1"}, - labels.Label{Name: "b", Value: "2"}, - }}, + labelSets: []labels.Labels{ + labels.FromStrings("a", "1", "b", "2"), + }, want: []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_RE, Name: "a", Value: "1"}, {Type: storepb.LabelMatcher_RE, Name: "b", Value: "2"}, @@ -56,22 +57,20 @@ func TestMatchersForLabelSets(t *testing.T) { }, { name: "multiple label sets with same label name", - labelSets: []labels.Labels{{ - labels.Label{Name: "a", Value: "1"}, - }, { - labels.Label{Name: "a", Value: "2"}, - }}, + labelSets: []labels.Labels{ + labels.FromStrings("a", "1"), + labels.FromStrings("a", "2"), + }, want: []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_RE, Name: "a", Value: "1|2"}, }, }, { name: "multiple label sets with different label name", - labelSets: []labels.Labels{{ - labels.Label{Name: "a", Value: "1"}, - }, { - labels.Label{Name: "b", Value: "2"}, - }}, + labelSets: []labels.Labels{ + labels.FromStrings("a", "1"), + labels.FromStrings("b", "2"), + }, want: []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_RE, Name: "a", Value: "1|^$"}, {Type: storepb.LabelMatcher_RE, Name: "b", Value: "2|^$"}, diff --git a/pkg/store/tsdb_test.go b/pkg/store/tsdb_test.go index 61b4875bfc..74b203a69f 100644 --- a/pkg/store/tsdb_test.go +++ b/pkg/store/tsdb_test.go @@ -29,40 +29,6 @@ import ( const skipMessage = "Chunk behavior changed due to https://github.com/prometheus/prometheus/pull/8723. Skip for now." -func TestTSDBStore_Info(t *testing.T) { - defer custom.TolerantVerifyLeak(t) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - db, err := e2eutil.NewTSDB() - defer func() { testutil.Ok(t, db.Close()) }() - testutil.Ok(t, err) - - tsdbStore := NewTSDBStore(nil, db, component.Rule, labels.FromStrings("region", "eu-west")) - - resp, err := tsdbStore.Info(ctx, &storepb.InfoRequest{}) - testutil.Ok(t, err) - - testutil.Equals(t, []labelpb.ZLabel{{Name: "region", Value: "eu-west"}}, resp.Labels) - testutil.Equals(t, storepb.StoreType_RULE, resp.StoreType) - testutil.Equals(t, int64(math.MaxInt64), resp.MinTime) - testutil.Equals(t, int64(math.MaxInt64), resp.MaxTime) - - app := db.Appender(context.Background()) - _, err = app.Append(0, labels.FromStrings("a", "a"), 12, 0.1) - testutil.Ok(t, err) - testutil.Ok(t, app.Commit()) - - resp, err = tsdbStore.Info(ctx, &storepb.InfoRequest{}) - testutil.Ok(t, err) - - testutil.Equals(t, []labelpb.ZLabel{{Name: "region", Value: "eu-west"}}, resp.Labels) - testutil.Equals(t, storepb.StoreType_RULE, resp.StoreType) - testutil.Equals(t, int64(12), resp.MinTime) - testutil.Equals(t, int64(math.MaxInt64), resp.MaxTime) -} - func TestTSDBStore_Series_ChunkChecksum(t *testing.T) { defer custom.TolerantVerifyLeak(t) @@ -158,12 +124,12 @@ func TestTSDBStore_Series(t *testing.T) { expectedSeries: []rawSeries{ { lset: labels.FromStrings("a", "1", "region", "eu-west"), - chunks: [][]sample{{{1, 1}, {2, 2}}}, + chunks: [][]sample{{{1, 1}, {2, 2}, {3, 3}}}, }, }, }, { - title: "dont't match time range series", + title: "don't match time range series", req: &storepb.SeriesRequest{ MinTime: 4, MaxTime: 6, @@ -185,7 +151,7 @@ func TestTSDBStore_Series(t *testing.T) { expectedError: "rpc error: code = InvalidArgument desc = no matchers specified (excluding external labels)", }, { - title: "dont't match labels", + title: "don't match labels", req: &storepb.SeriesRequest{ MinTime: 1, MaxTime: 3, @@ -257,7 +223,7 @@ func TestTSDBStore_SeriesAccessWithDelegateClosing(t *testing.T) { Random: random, SkipChunks: true, }) - _ = createBlockFromHead(t, tmpDir, head) + _ = storetestutil.CreateBlockFromHead(t, tmpDir, head) testutil.Ok(t, head.Close()) head, _ = storetestutil.CreateHeadWithSeries(t, 1, storetestutil.HeadGenOptions{ @@ -270,7 +236,7 @@ func TestTSDBStore_SeriesAccessWithDelegateClosing(t *testing.T) { }) testutil.Ok(t, head.Close()) - db, err := tsdb.OpenDBReadOnly(tmpDir, logger) + db, err := tsdb.OpenDBReadOnly(tmpDir, "", logger) testutil.Ok(t, err) dbToClose := make(chan *tsdb.DBReadOnly, 1) @@ -426,7 +392,7 @@ func TestTSDBStore_SeriesAccessWithoutDelegateClosing(t *testing.T) { Random: random, SkipChunks: true, }) - _ = createBlockFromHead(t, tmpDir, head) + _ = storetestutil.CreateBlockFromHead(t, tmpDir, head) testutil.Ok(t, head.Close()) head, _ = storetestutil.CreateHeadWithSeries(t, 1, storetestutil.HeadGenOptions{ @@ -439,7 +405,7 @@ func TestTSDBStore_SeriesAccessWithoutDelegateClosing(t *testing.T) { }) testutil.Ok(t, head.Close()) - db, err := tsdb.OpenDBReadOnly(tmpDir, logger) + db, err := tsdb.OpenDBReadOnly(tmpDir, "", logger) testutil.Ok(t, err) t.Cleanup(func() { if db != nil { @@ -520,11 +486,9 @@ func TestTSDBStore_SeriesAccessWithoutDelegateClosing(t *testing.T) { } func TestTSDBStoreSeries(t *testing.T) { - tb := testutil.NewTB(t) - // Make sure there are more samples, so we can check framing code. - storetestutil.RunSeriesInterestingCases(tb, 10e6, 200e3, func(t testutil.TB, samplesPerSeries, series int) { - benchTSDBStoreSeries(t, samplesPerSeries, series) - }) + t.Parallel() + + benchTSDBStoreSeries(testutil.NewTB(t), 10_000, 1) } func BenchmarkTSDBStoreSeries(b *testing.B) { @@ -566,7 +530,7 @@ func benchTSDBStoreSeries(t testutil.TB, totalSamples, totalSeries int) { resps[j] = append(resps[j], storepb.NewSeriesResponse(created[i])) } - _ = createBlockFromHead(t, tmpDir, head) + _ = storetestutil.CreateBlockFromHead(t, tmpDir, head) testutil.Ok(t, head.Close()) } @@ -583,7 +547,7 @@ func benchTSDBStoreSeries(t testutil.TB, totalSamples, totalSeries int) { resps[3] = append(resps[3], storepb.NewSeriesResponse(created[i])) } - db, err := tsdb.OpenDBReadOnly(tmpDir, logger) + db, err := tsdb.OpenDBReadOnly(tmpDir, "", logger) testutil.Ok(t, err) defer func() { testutil.Ok(t, db.Close()) }() diff --git a/pkg/strutil/labels.go b/pkg/strutil/labels.go new file mode 100644 index 0000000000..5423fd38eb --- /dev/null +++ b/pkg/strutil/labels.go @@ -0,0 +1,25 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package strutil + +import ( + "slices" + "strings" +) + +// ParseFlagLabels helps handle lists of labels passed from kingpin flags. +// * Split flag parts that are comma separated. +// * Remove any empty strings. +// * Sort and deduplicate the slice. +func ParseFlagLabels(f []string) []string { + var result []string + for _, l := range f { + if l == "" { + continue + } + result = append(result, strings.Split(l, ",")...) + } + slices.Sort(result) + return slices.Compact(result) +} diff --git a/pkg/strutil/labels_test.go b/pkg/strutil/labels_test.go new file mode 100644 index 0000000000..159fb6763e --- /dev/null +++ b/pkg/strutil/labels_test.go @@ -0,0 +1,43 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package strutil + +import ( + "testing" + + "github.com/efficientgo/core/testutil" +) + +func TestParseFlagLabels(t *testing.T) { + testCases := map[string]struct { + flags []string + expected []string + }{ + "single flag with commas": { + flags: []string{ + "a,b,c", + }, + expected: []string{"a", "b", "c"}, + }, + "multiple flags with commas": { + flags: []string{ + "a", "b", "c,d", + }, + expected: []string{"a", "b", "c", "d"}, + }, + "multiple flags empty strings": { + flags: []string{ + "a", "b", "", + }, + expected: []string{"a", "b"}, + }, + } + + for tcName, tc := range testCases { + t.Run(tcName, func(t *testing.T) { + res := ParseFlagLabels(tc.flags) + testutil.Equals(t, tc.expected, res) + }) + } +} diff --git a/pkg/strutil/merge.go b/pkg/strutil/merge.go index d6108771f4..a84f1ca673 100644 --- a/pkg/strutil/merge.go +++ b/pkg/strutil/merge.go @@ -10,33 +10,39 @@ import ( // MergeSlices merges a set of sorted string slices into a single ones // while removing all duplicates. -func MergeSlices(a ...[]string) []string { +// If limit is set, only the first limit results will be returned. 0 to disable. +func MergeSlices(limit int, a ...[]string) []string { if len(a) == 0 { return nil } if len(a) == 1 { - return a[0] + return truncateToLimit(limit, a[0]) } l := len(a) / 2 - return mergeTwoStringSlices(MergeSlices(a[:l]...), MergeSlices(a[l:]...)) + return mergeTwoStringSlices(limit, MergeSlices(limit, a[:l]...), MergeSlices(limit, a[l:]...)) } // MergeUnsortedSlices behaves like StringSlices but input slices are validated // for sortedness and are sorted if they are not ordered yet. -func MergeUnsortedSlices(a ...[]string) []string { +// If limit is set, only the first limit results will be returned. 0 to disable. +func MergeUnsortedSlices(limit int, a ...[]string) []string { for _, s := range a { if !sort.StringsAreSorted(s) { sort.Strings(s) } } - return MergeSlices(a...) + return MergeSlices(limit, a...) } -func mergeTwoStringSlices(a, b []string) []string { +func mergeTwoStringSlices(limit int, a, b []string) []string { + a = truncateToLimit(limit, a) + b = truncateToLimit(limit, b) + maxl := len(a) if len(b) > len(a) { maxl = len(b) } + res := make([]string, 0, maxl*10/9) for len(a) > 0 && len(b) > 0 { @@ -56,5 +62,13 @@ func mergeTwoStringSlices(a, b []string) []string { // Append all remaining elements. res = append(res, a...) res = append(res, b...) + res = truncateToLimit(limit, res) return res } + +func truncateToLimit(limit int, a []string) []string { + if limit > 0 && len(a) > limit { + return a[:limit] + } + return a +} diff --git a/pkg/strutil/merge_test.go b/pkg/strutil/merge_test.go new file mode 100644 index 0000000000..b50a5860f4 --- /dev/null +++ b/pkg/strutil/merge_test.go @@ -0,0 +1,111 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package strutil + +import ( + "fmt" + "testing" + + "github.com/efficientgo/core/testutil" +) + +func TestMergeSlices(t *testing.T) { + testCases := map[string]struct { + slices [][]string + limit int + expected []string + }{ + "empty slice": { + slices: [][]string{ + {}, + }, + expected: []string{}, + }, + "single slice with limit": { + slices: [][]string{ + {"a", "b", "c", "d"}, + }, + limit: 2, + expected: []string{"a", "b"}, + }, + "multiple slices with limit": { + slices: [][]string{ + {"a", "b", "d", "f"}, + {"c", "e", "g"}, + {"r", "s", "t"}, + }, + limit: 4, + expected: []string{"a", "b", "c", "d"}, + }, + "multiple slices without limit": { + slices: [][]string{ + {"a", "b", "d", "f"}, + {"c", "e", "g"}, + {"r", "s"}, + }, + expected: []string{"a", "b", "c", "d", "e", "f", "g", "r", "s"}, + }, + } + + for tcName, tc := range testCases { + t.Run(tcName, func(t *testing.T) { + res := MergeSlices(tc.limit, tc.slices...) + testutil.Equals(t, tc.expected, res) + }) + } +} + +func TestMergeUnsortedSlices(t *testing.T) { + testCases := map[string]struct { + slices [][]string + limit int + expected []string + }{ + "empty slice": { + slices: [][]string{ + {}, + }, + expected: []string{}, + }, + "multiple slices without limit": { + slices: [][]string{ + {"d", "c", "b", "a"}, + {"f", "g", "c"}, + {"s", "r", "e"}, + }, + expected: []string{"a", "b", "c", "d", "e", "f", "g", "r", "s"}, + }, + "multiple slices with limit": { + slices: [][]string{ + {"d", "c", "b", "a"}, + {"f", "g", "c"}, + {"s", "r", "e"}, + }, + limit: 5, + expected: []string{"a", "b", "c", "d", "e"}, + }, + } + + for tcName, tc := range testCases { + t.Run(tcName, func(t *testing.T) { + res := MergeUnsortedSlices(tc.limit, tc.slices...) + testutil.Equals(t, tc.expected, res) + }) + } +} + +func BenchmarkMergeSlices(b *testing.B) { + var slices [][]string + for i := 0; i < 10; i++ { + var slice []string + for j := 0; j < 10000; j++ { + slice = append(slice, fmt.Sprintf("str_%d_%d", i, j)) + } + slices = append(slices, slice) + } + + b.Run("benchmark", func(b *testing.B) { + MergeSlices(1000, slices...) + }) +} diff --git a/pkg/tenancy/tenancy.go b/pkg/tenancy/tenancy.go index aec0bad86a..9da1372933 100644 --- a/pkg/tenancy/tenancy.go +++ b/pkg/tenancy/tenancy.go @@ -11,8 +11,9 @@ import ( "github.com/pkg/errors" "github.com/prometheus-community/prom-label-proxy/injectproxy" "github.com/prometheus/prometheus/model/labels" - "github.com/prometheus/prometheus/promql/parser" "google.golang.org/grpc/metadata" + + "github.com/thanos-io/thanos/pkg/extpromql" ) type contextKey int @@ -148,7 +149,7 @@ func EnforceQueryTenancy(tenantLabel string, tenant string, query string) (strin e := injectproxy.NewEnforcer(false, labelMatcher) - expr, err := parser.ParseExpr(query) + expr, err := extpromql.ParseExpr(query) if err != nil { return "", errors.Wrap(err, "error parsing query string, when enforcing tenenacy") } @@ -178,7 +179,7 @@ func getLabelMatchers(formMatchers []string, tenant string, enforceTenancy bool, } for _, s := range formMatchers { - matchers, err := parser.ParseMetricSelector(s) + matchers, err := extpromql.ParseMetricSelector(s) if err != nil { return nil, err } diff --git a/pkg/tenancy/tenancy_test.go b/pkg/tenancy/tenancy_test.go index c5c9563c44..4418fa36e4 100644 --- a/pkg/tenancy/tenancy_test.go +++ b/pkg/tenancy/tenancy_test.go @@ -8,18 +8,14 @@ import ( "testing" "time" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" - "github.com/efficientgo/core/testutil" + "github.com/pkg/errors" "github.com/thanos-io/thanos/pkg/component" "github.com/thanos-io/thanos/pkg/store" "github.com/thanos-io/thanos/pkg/store/storepb" "github.com/thanos-io/thanos/pkg/tenancy" - - "github.com/pkg/errors" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" storetestutil "github.com/thanos-io/thanos/pkg/store/storepb/testutil" ) @@ -63,10 +59,6 @@ func getAndAssertTenant(ctx context.Context, t *testing.T) { testutil.Assert(t, tenant == testTenant) } -func (s *mockedStoreAPI) Info(context.Context, *storepb.InfoRequest, ...grpc.CallOption) (*storepb.InfoResponse, error) { - return nil, status.Error(codes.Unimplemented, "not implemented") -} - func (s *mockedStoreAPI) Series(ctx context.Context, req *storepb.SeriesRequest, _ ...grpc.CallOption) (storepb.Store_SeriesClient, error) { getAndAssertTenant(ctx, s.t) @@ -196,3 +188,37 @@ func TestTenantProxyPassing(t *testing.T) { _ = q.Series(&storepb.SeriesRequest{Matchers: seriesMatchers}, &storeSeriesServer{ctx: ctx}) }) } + +func TestEnforceQueryTenancy(t *testing.T) { + tests := []struct { + name string + tenantLabel string + tenant string + query string + expectedQuery string + }{ + { + name: "vector selector query", + tenantLabel: "tenant_id", + tenant: "test-tenant", + query: `{__name__="test_metric", job="test_job"}`, + expectedQuery: `{__name__="test_metric",job="test_job",tenant_id="test-tenant"}`, + }, + { + name: "with aggregation and extended functions", + tenantLabel: "tenant_id", + tenant: "test-tenant", + query: `sum by (job) (xrate(test_metric{job="test_job"}[5m]))`, + expectedQuery: `sum by (job) (xrate(test_metric{job="test_job",tenant_id="test-tenant"}[5m]))`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + resultQuery, err := tenancy.EnforceQueryTenancy(tt.tenantLabel, tt.tenant, tt.query) + testutil.Ok(t, err) + + testutil.Equals(t, tt.expectedQuery, resultQuery) + }) + } +} diff --git a/pkg/testutil/e2eutil/prometheus.go b/pkg/testutil/e2eutil/prometheus.go index 4faba4fafd..5d784a9cc0 100644 --- a/pkg/testutil/e2eutil/prometheus.go +++ b/pkg/testutil/e2eutil/prometheus.go @@ -42,7 +42,7 @@ import ( ) const ( - defaultPrometheusVersion = "v0.37.0" + defaultPrometheusVersion = "v0.54.1" defaultAlertmanagerVersion = "v0.20.0" defaultMinioVersion = "RELEASE.2022-07-30T05-21-40Z" @@ -605,14 +605,14 @@ func createBlock( return id, errors.Wrap(err, "create compactor") } - id, err = c.Write(dir, h, mint, maxt, nil) + ids, err := c.Write(dir, h, mint, maxt, nil) if err != nil { return id, errors.Wrap(err, "write block") } - - if id.Compare(ulid.ULID{}) == 0 { + if len(ids) == 0 { return id, errors.Errorf("nothing to write, asked for %d samples", numSamples) } + id = ids[0] blockDir := filepath.Join(dir, id.String()) logger := log.NewNopLogger() @@ -769,14 +769,15 @@ func CreateBlockWithChurn( return id, errors.Wrap(err, "create compactor") } - id, err = c.Write(dir, h, mint, maxt, nil) + ids, err := c.Write(dir, h, mint, maxt, nil) if err != nil { return id, errors.Wrap(err, "write block") } - if id.Compare(ulid.ULID{}) == 0 { + if len(ids) == 0 { return id, errors.Errorf("nothing to write, asked for %d samples", numSamples) } + id = ids[0] blockDir := filepath.Join(dir, id.String()) logger := log.NewNopLogger() diff --git a/pkg/tls/options.go b/pkg/tls/options.go index 362f73740b..5b6f4fb8de 100644 --- a/pkg/tls/options.go +++ b/pkg/tls/options.go @@ -6,8 +6,11 @@ package tls import ( "crypto/tls" "crypto/x509" + "fmt" "os" "path/filepath" + "sort" + "strings" "sync" "time" @@ -17,7 +20,7 @@ import ( ) // NewServerConfig provides new server TLS configuration. -func NewServerConfig(logger log.Logger, certPath, keyPath, clientCA string) (*tls.Config, error) { +func NewServerConfig(logger log.Logger, certPath, keyPath, clientCA, tlsMinVersion string) (*tls.Config, error) { if keyPath == "" && certPath == "" { if clientCA != "" { return nil, errors.New("when a client CA is used a server key and certificate must also be provided") @@ -33,8 +36,18 @@ func NewServerConfig(logger log.Logger, certPath, keyPath, clientCA string) (*tl return nil, errors.New("both server key and certificate must be provided") } + minTlsVersion, err := getTlsVersion(tlsMinVersion) + if err != nil { + return nil, err + } + tlsCfg := &tls.Config{ - MinVersion: tls.VersionTLS13, + MinVersion: minTlsVersion, + } + // Certificate is loaded during server startup to check for any errors. + certificate, err := tls.LoadX509KeyPair(certPath, keyPath) + if err != nil { + return nil, errors.Wrap(err, "server credentials") } // Certificate is loaded during server startup to check for any errors. certificate, err := tls.LoadX509KeyPair(certPath, keyPath) @@ -190,3 +203,35 @@ func (m *clientTLSManager) getClientCertificate(*tls.CertificateRequestInfo) (*t return m.cert, nil } + +type validOption struct { + tlsOption map[string]uint16 +} + +func (validOption validOption) joinString() string { + var keys []string + + for key := range validOption.tlsOption { + keys = append(keys, key) + } + sort.Strings(keys) + return strings.Join(keys, ", ") +} + +func getTlsVersion(tlsMinVersion string) (uint16, error) { + + validOption := validOption{ + tlsOption: map[string]uint16{ + "1.0": tls.VersionTLS10, + "1.1": tls.VersionTLS11, + "1.2": tls.VersionTLS12, + "1.3": tls.VersionTLS13, + }, + } + + if _, ok := validOption.tlsOption[tlsMinVersion]; !ok { + return 0, errors.New(fmt.Sprintf("invalid TLS version: %s, valid values are %s", tlsMinVersion, validOption.joinString())) + } + + return validOption.tlsOption[tlsMinVersion], nil +} diff --git a/pkg/tls/options_test.go b/pkg/tls/options_test.go new file mode 100644 index 0000000000..4070286efa --- /dev/null +++ b/pkg/tls/options_test.go @@ -0,0 +1,58 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +package tls + +import ( + "crypto/tls" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestTlsOptions(t *testing.T) { + var tests = []struct { + input string + fail bool + result uint16 + }{ + { + input: "", + fail: true, + }, { + input: "ab", + fail: true, + }, { + input: "1", + fail: true, + }, { + input: "1.0", + result: tls.VersionTLS10, + }, + { + input: "1.1", + result: tls.VersionTLS11, + }, + { + input: "1.2", + result: tls.VersionTLS12, + }, + { + input: "1.3", + result: tls.VersionTLS13, + }, + } + + for _, test := range tests { + minTlsVersion, err := getTlsVersion(test.input) + + if test.fail { + require.Error(t, err) + continue + } + + require.NoError(t, err) + assert.Equal(t, test.result, minTlsVersion) + } +} diff --git a/pkg/tracing/grpc.go b/pkg/tracing/grpc.go index 78b4391bf8..93ec18cd18 100644 --- a/pkg/tracing/grpc.go +++ b/pkg/tracing/grpc.go @@ -7,8 +7,8 @@ import ( "context" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware/v2" - grpc_opentracing "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/tracing" - opentracing "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go" + grpc_opentracing "github.com/thanos-io/thanos/pkg/tracing/tracing_middleware" "google.golang.org/grpc" ) diff --git a/pkg/tracing/http.go b/pkg/tracing/http.go index 21b6663f4f..0ea07c9e00 100644 --- a/pkg/tracing/http.go +++ b/pkg/tracing/http.go @@ -14,6 +14,8 @@ import ( "github.com/go-kit/log/level" "github.com/opentracing/opentracing-go" "github.com/opentracing/opentracing-go/ext" + + "github.com/thanos-io/thanos/pkg/server/http/middleware" "github.com/thanos-io/thanos/pkg/tracing/migration" ) @@ -32,6 +34,9 @@ func HTTPMiddleware(tracer opentracing.Tracer, name string, logger log.Logger, n } opts := []opentracing.StartSpanOption{ext.RPCServerOption(wireContext)} + if requestID, ok := middleware.RequestIDFromContext(r.Context()); ok { + opts = append(opts, opentracing.Tag{Key: "request_id", Value: requestID}) + } // Check for force tracing header and add it as a tag at the start of span. // This is required for the OpenTelemetry sampler to force tracing. if r.Header.Get(ForceTracingBaggageKey) != "" { diff --git a/pkg/tracing/interceptors/client.go b/pkg/tracing/interceptors/client.go new file mode 100644 index 0000000000..a45ec8fcb5 --- /dev/null +++ b/pkg/tracing/interceptors/client.go @@ -0,0 +1,85 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +// gRPC Prometheus monitoring interceptors for client-side gRPC. + +package interceptors + +import ( + "context" + "time" + + "google.golang.org/grpc" +) + +// UnaryClientInterceptor is a gRPC client-side interceptor that provides reporting for Unary RPCs. +func UnaryClientInterceptor(reportable ClientReportable) grpc.UnaryClientInterceptor { + return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + r := newReport(Unary, method) + reporter, newCtx := reportable.ClientReporter(ctx, req, r.rpcType, r.service, r.method) + + reporter.PostMsgSend(req, nil, time.Since(r.startTime)) + err := invoker(newCtx, method, req, reply, cc, opts...) + reporter.PostMsgReceive(reply, err, time.Since(r.startTime)) + + reporter.PostCall(err, time.Since(r.startTime)) + return err + } +} + +// StreamClientInterceptor is a gRPC client-side interceptor that provides reporting for Stream RPCs. +func StreamClientInterceptor(reportable ClientReportable) grpc.StreamClientInterceptor { + return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { + r := newReport(clientStreamType(desc), method) + reporter, newCtx := reportable.ClientReporter(ctx, nil, r.rpcType, r.service, r.method) + + clientStream, err := streamer(newCtx, desc, cc, method, opts...) + if err != nil { + reporter.PostCall(err, time.Since(r.startTime)) + return nil, err + } + return &monitoredClientStream{ClientStream: clientStream, startTime: r.startTime, reporter: reporter}, nil + } +} + +func clientStreamType(desc *grpc.StreamDesc) GRPCType { + if desc.ClientStreams && !desc.ServerStreams { + return ClientStream + } else if !desc.ClientStreams && desc.ServerStreams { + return ServerStream + } + return BidiStream +} + +// monitoredClientStream wraps grpc.ClientStream allowing each Sent/Recv of message to report. +type monitoredClientStream struct { + grpc.ClientStream + + startTime time.Time + reporter Reporter +} + +func (s *monitoredClientStream) SendMsg(m interface{}) error { + start := time.Now() + err := s.ClientStream.SendMsg(m) + s.reporter.PostMsgSend(m, err, time.Since(start)) + return err +} + +func (s *monitoredClientStream) RecvMsg(m interface{}) error { + start := time.Now() + err := s.ClientStream.RecvMsg(m) + s.reporter.PostMsgReceive(m, err, time.Since(start)) + + if err == nil { + return nil + } + + s.reporter.PostCall(err, time.Since(s.startTime)) + return err +} diff --git a/pkg/tracing/interceptors/reporter.go b/pkg/tracing/interceptors/reporter.go new file mode 100644 index 0000000000..4ccdb0b61e --- /dev/null +++ b/pkg/tracing/interceptors/reporter.go @@ -0,0 +1,87 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package interceptors + +import ( + "context" + "fmt" + "strings" + "time" + + "google.golang.org/grpc/codes" +) + +type GRPCType string + +const ( + Unary GRPCType = "unary" + ClientStream GRPCType = "client_stream" + ServerStream GRPCType = "server_stream" + BidiStream GRPCType = "bidi_stream" +) + +var ( + AllCodes = []codes.Code{ + codes.OK, codes.Canceled, codes.Unknown, codes.InvalidArgument, codes.DeadlineExceeded, codes.NotFound, + codes.AlreadyExists, codes.PermissionDenied, codes.Unauthenticated, codes.ResourceExhausted, + codes.FailedPrecondition, codes.Aborted, codes.OutOfRange, codes.Unimplemented, codes.Internal, + codes.Unavailable, codes.DataLoss, + } +) + +func splitMethodName(fullMethod string) (string, string) { + fullMethod = strings.TrimPrefix(fullMethod, "/") // remove leading slash + if i := strings.Index(fullMethod, "/"); i >= 0 { + return fullMethod[:i], fullMethod[i+1:] + } + return "unknown", "unknown" +} + +func FullMethod(service, method string) string { + return fmt.Sprintf("/%s/%s", service, method) +} + +type ClientReportable interface { + ClientReporter(ctx context.Context, reqProtoOrNil interface{}, typ GRPCType, service string, method string) (Reporter, context.Context) +} + +type ServerReportable interface { + ServerReporter(ctx context.Context, reqProtoOrNil interface{}, typ GRPCType, service string, method string) (Reporter, context.Context) +} + +type Reporter interface { + PostCall(err error, rpcDuration time.Duration) + + PostMsgSend(reqProto interface{}, err error, sendDuration time.Duration) + PostMsgReceive(replyProto interface{}, err error, recvDuration time.Duration) +} + +var _ Reporter = NoopReporter{} + +type NoopReporter struct{} + +func (NoopReporter) PostCall(error, time.Duration) {} +func (NoopReporter) PostMsgSend(interface{}, error, time.Duration) {} +func (NoopReporter) PostMsgReceive(interface{}, error, time.Duration) {} + +type report struct { + rpcType GRPCType + service string + method string + startTime time.Time +} + +func newReport(typ GRPCType, fullMethod string) report { + r := report{ + startTime: time.Now(), + rpcType: typ, + } + r.service, r.method = splitMethodName(fullMethod) + return r +} diff --git a/pkg/tracing/interceptors/server.go b/pkg/tracing/interceptors/server.go new file mode 100644 index 0000000000..7bfed7bae5 --- /dev/null +++ b/pkg/tracing/interceptors/server.go @@ -0,0 +1,79 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +// gRPC Prometheus monitoring interceptors for server-side gRPC. + +package interceptors + +import ( + "context" + "time" + + "google.golang.org/grpc" +) + +// UnaryServerInterceptor is a gRPC server-side interceptor that provides reporting for Unary RPCs. +func UnaryServerInterceptor(reportable ServerReportable) grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + r := newReport(Unary, info.FullMethod) + reporter, newCtx := reportable.ServerReporter(ctx, req, r.rpcType, r.service, r.method) + + reporter.PostMsgReceive(req, nil, time.Since(r.startTime)) + resp, err := handler(newCtx, req) + reporter.PostMsgSend(resp, err, time.Since(r.startTime)) + + reporter.PostCall(err, time.Since(r.startTime)) + return resp, err + } +} + +// StreamServerInterceptor is a gRPC server-side interceptor that provides reporting for Streaming RPCs. +func StreamServerInterceptor(reportable ServerReportable) grpc.StreamServerInterceptor { + return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + r := newReport(ServerStream, info.FullMethod) + reporter, newCtx := reportable.ServerReporter(ss.Context(), nil, streamRPCType(info), r.service, r.method) + err := handler(srv, &monitoredServerStream{ServerStream: ss, newCtx: newCtx, reporter: reporter}) + reporter.PostCall(err, time.Since(r.startTime)) + return err + } +} + +func streamRPCType(info *grpc.StreamServerInfo) GRPCType { + if info.IsClientStream && !info.IsServerStream { + return ClientStream + } else if !info.IsClientStream && info.IsServerStream { + return ServerStream + } + return BidiStream +} + +// monitoredStream wraps grpc.ServerStream allowing each Sent/Recv of message to report. +type monitoredServerStream struct { + grpc.ServerStream + + newCtx context.Context + reporter Reporter +} + +func (s *monitoredServerStream) Context() context.Context { + return s.newCtx +} + +func (s *monitoredServerStream) SendMsg(m interface{}) error { + start := time.Now() + err := s.ServerStream.SendMsg(m) + s.reporter.PostMsgSend(m, err, time.Since(start)) + return err +} + +func (s *monitoredServerStream) RecvMsg(m interface{}) error { + start := time.Now() + err := s.ServerStream.RecvMsg(m) + s.reporter.PostMsgReceive(m, err, time.Since(start)) + return err +} diff --git a/pkg/tracing/otlp/config_yaml.go b/pkg/tracing/otlp/config_yaml.go index b8aa6f9dc8..abce5370e2 100644 --- a/pkg/tracing/otlp/config_yaml.go +++ b/pkg/tracing/otlp/config_yaml.go @@ -22,6 +22,7 @@ type retryConfig struct { type Config struct { ClientType string `yaml:"client_type"` ServiceName string `yaml:"service_name"` + ResourceAttributes map[string]string `yaml:"resource_attributes"` ReconnectionPeriod time.Duration `yaml:"reconnection_period"` Compression string `yaml:"compression"` Insecure bool `yaml:"insecure"` diff --git a/pkg/tracing/otlp/otlp.go b/pkg/tracing/otlp/otlp.go index bf29d3622b..cb5220240a 100644 --- a/pkg/tracing/otlp/otlp.go +++ b/pkg/tracing/otlp/otlp.go @@ -8,6 +8,8 @@ import ( "strconv" "strings" + "go.opentelemetry.io/otel/attribute" + "github.com/thanos-io/thanos/pkg/tracing/migration" "github.com/go-kit/log" @@ -70,26 +72,27 @@ func NewTracerProvider(ctx context.Context, logger log.Logger, conf []byte) (*tr if err != nil { logger.Log(err) } - tp := newTraceProvider(ctx, processor, logger, config.ServiceName, sampler) + tp := newTraceProvider(ctx, processor, logger, config.ServiceName, config.ResourceAttributes, sampler) return tp, nil } -func newTraceProvider(ctx context.Context, processor tracesdk.SpanProcessor, logger log.Logger, serviceName string, sampler tracesdk.Sampler) *tracesdk.TracerProvider { - var ( - r *resource.Resource - err error - ) +func newTraceProvider( + ctx context.Context, + processor tracesdk.SpanProcessor, + logger log.Logger, + serviceName string, + attrs map[string]string, + sampler tracesdk.Sampler, +) *tracesdk.TracerProvider { + resourceAttrs := make([]attribute.KeyValue, 0, len(attrs)+1) if serviceName != "" { - r, err = resource.New( - ctx, - resource.WithAttributes(semconv.ServiceNameKey.String(serviceName)), - ) - } else { - r, err = resource.New( - ctx, - ) + resourceAttrs = append(resourceAttrs, semconv.ServiceNameKey.String(serviceName)) + } + for k, v := range attrs { + resourceAttrs = append(resourceAttrs, attribute.String(k, v)) } + r, err := resource.New(ctx, resource.WithAttributes(resourceAttrs...)) if err != nil { level.Warn(logger).Log("msg", "jaeger: detecting resources for tracing provider failed", "err", err) } diff --git a/pkg/tracing/otlp/otlp_test.go b/pkg/tracing/otlp/otlp_test.go index 1f651e9c87..c0c0c8c0dc 100644 --- a/pkg/tracing/otlp/otlp_test.go +++ b/pkg/tracing/otlp/otlp_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/efficientgo/core/testutil" + "github.com/thanos-io/thanos/pkg/tracing" "github.com/thanos-io/thanos/pkg/tracing/migration" @@ -20,12 +21,7 @@ import ( func TestContextTracing_ClientEnablesTracing(t *testing.T) { exp := tracetest.NewInMemoryExporter() - tracerOtel := newTraceProvider( - context.Background(), - tracesdk.NewSimpleSpanProcessor(exp), - log.NewNopLogger(), - "thanos", - tracesdk.AlwaysSample()) + tracerOtel := newTraceProvider(context.Background(), tracesdk.NewSimpleSpanProcessor(exp), log.NewNopLogger(), "thanos", nil, tracesdk.AlwaysSample()) tracer, _ := migration.Bridge(tracerOtel, log.NewNopLogger()) clientRoot, _ := tracing.StartSpan(tracing.ContextWithTracer(context.Background(), tracer), "a") diff --git a/pkg/tracing/tracing_middleware/client.go b/pkg/tracing/tracing_middleware/client.go new file mode 100644 index 0000000000..77167c957f --- /dev/null +++ b/pkg/tracing/tracing_middleware/client.go @@ -0,0 +1,106 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package tracing_middleware + +import ( + "context" + + "io" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "github.com/opentracing/opentracing-go/log" + "google.golang.org/grpc" + "google.golang.org/grpc/grpclog" + + "github.com/thanos-io/thanos/pkg/tracing/interceptors" + "github.com/thanos-io/thanos/pkg/tracing/util/metautils" +) + +type opentracingClientReporter struct { + typ interceptors.GRPCType + svcName, methodName string + + clientSpan opentracing.Span +} + +func (o *opentracingClientReporter) PostCall(err error, _ time.Duration) { + // Finish span. + if err != nil && err != io.EOF { + ext.Error.Set(o.clientSpan, true) + o.clientSpan.LogFields(log.String("event", "error"), log.String("message", err.Error())) + } + o.clientSpan.Finish() +} + +func (o *opentracingClientReporter) PostMsgSend(interface{}, error, time.Duration) {} + +func (o *opentracingClientReporter) PostMsgReceive(interface{}, error, time.Duration) {} + +type opentracingClientReportable struct { + tracer opentracing.Tracer + filterOutFunc FilterFunc +} + +func (o *opentracingClientReportable) ClientReporter(ctx context.Context, _ interface{}, typ interceptors.GRPCType, service string, method string) (interceptors.Reporter, context.Context) { + if o.filterOutFunc != nil && !o.filterOutFunc(ctx, method) { + return interceptors.NoopReporter{}, ctx + } + + newCtx, clientSpan := newClientSpanFromContext(ctx, o.tracer, interceptors.FullMethod(service, method)) + mock := &opentracingClientReporter{typ: typ, svcName: service, methodName: method, clientSpan: clientSpan} + return mock, newCtx +} + +// UnaryClientInterceptor returns a new unary client interceptor for OpenTracing. +func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor { + o := evaluateOptions(opts) + return interceptors.UnaryClientInterceptor(&opentracingClientReportable{tracer: o.tracer, filterOutFunc: o.filterOutFunc}) +} + +// StreamClientInterceptor returns a new streaming client interceptor for OpenTracing. +func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor { + o := evaluateOptions(opts) + return interceptors.StreamClientInterceptor(&opentracingClientReportable{tracer: o.tracer, filterOutFunc: o.filterOutFunc}) +} + +// ClientAddContextTags returns a context with specified opentracing tags, which +// are used by UnaryClientInterceptor/StreamClientInterceptor when creating a +// new span. +func ClientAddContextTags(ctx context.Context, tags opentracing.Tags) context.Context { + return context.WithValue(ctx, clientSpanTagKey{}, tags) +} + +type clientSpanTagKey struct{} + +func newClientSpanFromContext(ctx context.Context, tracer opentracing.Tracer, fullMethodName string) (context.Context, opentracing.Span) { + var parentSpanCtx opentracing.SpanContext + if parent := opentracing.SpanFromContext(ctx); parent != nil { + parentSpanCtx = parent.Context() + } + opts := []opentracing.StartSpanOption{ + opentracing.ChildOf(parentSpanCtx), + ext.SpanKindRPCClient, + grpcTag, + } + if tagx := ctx.Value(clientSpanTagKey{}); tagx != nil { + if opt, ok := tagx.(opentracing.StartSpanOption); ok { + opts = append(opts, opt) + } + } + clientSpan := tracer.StartSpan(fullMethodName, opts...) + // Make sure we add this to the metadata of the call, so it gets propagated: + md := metautils.ExtractOutgoing(ctx).Clone() + if err := tracer.Inject(clientSpan.Context(), opentracing.HTTPHeaders, metadataTextMap(md)); err != nil { + grpclog.Infof("grpc_opentracing: failed serializing trace information: %v", err) + } + ctxWithMetadata := md.ToOutgoing(ctx) + return opentracing.ContextWithSpan(ctxWithMetadata, clientSpan), clientSpan +} diff --git a/pkg/tracing/tracing_middleware/doc.go b/pkg/tracing/tracing_middleware/doc.go new file mode 100644 index 0000000000..d0db22e1db --- /dev/null +++ b/pkg/tracing/tracing_middleware/doc.go @@ -0,0 +1,29 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +// Package tracing_middleware +/* +tracing is a "parent" package for gRPC logging middlewares. + +This middleware relies on OpenTracing as our tracing interface. + +OpenTracing Interceptors + +These are both client-side and server-side interceptors for OpenTracing. They are a provider-agnostic, with backends +such as Zipkin, or Google Stackdriver Trace. + +For a service that sends out requests and receives requests, you *need* to use both, otherwise downstream requests will +not have the appropriate requests propagated. + +All server-side spans are tagged with grpc_ctxtags information. + +For more information see: +http://opentracing.io/documentation/ +https://github.com/opentracing/specification/blob/master/semantic_conventions.md +*/ +package tracing_middleware diff --git a/pkg/tracing/tracing_middleware/grpctesting/gogotestpb/fields.pb.go b/pkg/tracing/tracing_middleware/grpctesting/gogotestpb/fields.pb.go new file mode 100644 index 0000000000..315ffdf8ad --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/gogotestpb/fields.pb.go @@ -0,0 +1,1630 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: fields.proto + +// This file is used for grpctesting discovery of log fields from requests using reflection and gogo proto more tags. + +package gogotestpb + +import ( + fmt "fmt" + io "io" + math "math" + time "time" + + _ "github.com/gogo/protobuf/gogoproto" + _ "github.com/gogo/protobuf/types" + github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + proto "github.com/golang/protobuf/proto" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf +var _ = time.Kitchen + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type Metadata struct { + Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty" log_field:"meta_tags"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { + return fileDescriptor_d39ad626ec0e575e, []int{0} +} +func (m *Metadata) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Metadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Metadata.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Metadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metadata.Merge(m, src) +} +func (m *Metadata) XXX_Size() int { + return m.Size() +} +func (m *Metadata) XXX_DiscardUnknown() { + xxx_messageInfo_Metadata.DiscardUnknown(m) +} + +var xxx_messageInfo_Metadata proto.InternalMessageInfo + +func (m *Metadata) GetTags() []string { + if m != nil { + return m.Tags + } + return nil +} + +type PingId struct { + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty" log_field:"ping_id"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PingId) Reset() { *m = PingId{} } +func (m *PingId) String() string { return proto.CompactTextString(m) } +func (*PingId) ProtoMessage() {} +func (*PingId) Descriptor() ([]byte, []int) { + return fileDescriptor_d39ad626ec0e575e, []int{1} +} +func (m *PingId) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PingId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PingId.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PingId) XXX_Merge(src proto.Message) { + xxx_messageInfo_PingId.Merge(m, src) +} +func (m *PingId) XXX_Size() int { + return m.Size() +} +func (m *PingId) XXX_DiscardUnknown() { + xxx_messageInfo_PingId.DiscardUnknown(m) +} + +var xxx_messageInfo_PingId proto.InternalMessageInfo + +func (m *PingId) GetId() int32 { + if m != nil { + return m.Id + } + return 0 +} + +type Ping struct { + Id *PingId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ping) Reset() { *m = Ping{} } +func (m *Ping) String() string { return proto.CompactTextString(m) } +func (*Ping) ProtoMessage() {} +func (*Ping) Descriptor() ([]byte, []int) { + return fileDescriptor_d39ad626ec0e575e, []int{2} +} +func (m *Ping) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Ping.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Ping) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ping.Merge(m, src) +} +func (m *Ping) XXX_Size() int { + return m.Size() +} +func (m *Ping) XXX_DiscardUnknown() { + xxx_messageInfo_Ping.DiscardUnknown(m) +} + +var xxx_messageInfo_Ping proto.InternalMessageInfo + +func (m *Ping) GetId() *PingId { + if m != nil { + return m.Id + } + return nil +} + +func (m *Ping) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +type PingRequest struct { + Ping *Ping `protobuf:"bytes,1,opt,name=ping,proto3" json:"ping,omitempty"` + Meta *Metadata `protobuf:"bytes,2,opt,name=meta,proto3" json:"meta,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PingRequest) Reset() { *m = PingRequest{} } +func (m *PingRequest) String() string { return proto.CompactTextString(m) } +func (*PingRequest) ProtoMessage() {} +func (*PingRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d39ad626ec0e575e, []int{3} +} +func (m *PingRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PingRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PingRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PingRequest.Merge(m, src) +} +func (m *PingRequest) XXX_Size() int { + return m.Size() +} +func (m *PingRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PingRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PingRequest proto.InternalMessageInfo + +func (m *PingRequest) GetPing() *Ping { + if m != nil { + return m.Ping + } + return nil +} + +func (m *PingRequest) GetMeta() *Metadata { + if m != nil { + return m.Meta + } + return nil +} + +type Pong struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" log_field:"pong_id"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Pong) Reset() { *m = Pong{} } +func (m *Pong) String() string { return proto.CompactTextString(m) } +func (*Pong) ProtoMessage() {} +func (*Pong) Descriptor() ([]byte, []int) { + return fileDescriptor_d39ad626ec0e575e, []int{4} +} +func (m *Pong) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Pong) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Pong.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Pong) XXX_Merge(src proto.Message) { + xxx_messageInfo_Pong.Merge(m, src) +} +func (m *Pong) XXX_Size() int { + return m.Size() +} +func (m *Pong) XXX_DiscardUnknown() { + xxx_messageInfo_Pong.DiscardUnknown(m) +} + +var xxx_messageInfo_Pong proto.InternalMessageInfo + +func (m *Pong) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +type PongRequest struct { + Pong *Pong `protobuf:"bytes,1,opt,name=pong,proto3" json:"pong,omitempty"` + Meta *Metadata `protobuf:"bytes,2,opt,name=meta,proto3" json:"meta,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PongRequest) Reset() { *m = PongRequest{} } +func (m *PongRequest) String() string { return proto.CompactTextString(m) } +func (*PongRequest) ProtoMessage() {} +func (*PongRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d39ad626ec0e575e, []int{5} +} +func (m *PongRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PongRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PongRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PongRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PongRequest.Merge(m, src) +} +func (m *PongRequest) XXX_Size() int { + return m.Size() +} +func (m *PongRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PongRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PongRequest proto.InternalMessageInfo + +func (m *PongRequest) GetPong() *Pong { + if m != nil { + return m.Pong + } + return nil +} + +func (m *PongRequest) GetMeta() *Metadata { + if m != nil { + return m.Meta + } + return nil +} + +type GoGoProtoStdTime struct { + Timestamp *time.Time `protobuf:"bytes,1,opt,name=timestamp,proto3,stdtime" json:"timestamp,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GoGoProtoStdTime) Reset() { *m = GoGoProtoStdTime{} } +func (m *GoGoProtoStdTime) String() string { return proto.CompactTextString(m) } +func (*GoGoProtoStdTime) ProtoMessage() {} +func (*GoGoProtoStdTime) Descriptor() ([]byte, []int) { + return fileDescriptor_d39ad626ec0e575e, []int{6} +} +func (m *GoGoProtoStdTime) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GoGoProtoStdTime) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GoGoProtoStdTime.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GoGoProtoStdTime) XXX_Merge(src proto.Message) { + xxx_messageInfo_GoGoProtoStdTime.Merge(m, src) +} +func (m *GoGoProtoStdTime) XXX_Size() int { + return m.Size() +} +func (m *GoGoProtoStdTime) XXX_DiscardUnknown() { + xxx_messageInfo_GoGoProtoStdTime.DiscardUnknown(m) +} + +var xxx_messageInfo_GoGoProtoStdTime proto.InternalMessageInfo + +func (m *GoGoProtoStdTime) GetTimestamp() *time.Time { + if m != nil { + return m.Timestamp + } + return nil +} + +func init() { + proto.RegisterType((*Metadata)(nil), "grpc_middleware.gogotestpb.Metadata") + proto.RegisterType((*PingId)(nil), "grpc_middleware.gogotestpb.PingId") + proto.RegisterType((*Ping)(nil), "grpc_middleware.gogotestpb.Ping") + proto.RegisterType((*PingRequest)(nil), "grpc_middleware.gogotestpb.PingRequest") + proto.RegisterType((*Pong)(nil), "grpc_middleware.gogotestpb.Pong") + proto.RegisterType((*PongRequest)(nil), "grpc_middleware.gogotestpb.PongRequest") + proto.RegisterType((*GoGoProtoStdTime)(nil), "grpc_middleware.gogotestpb.GoGoProtoStdTime") +} + +func init() { proto.RegisterFile("fields.proto", fileDescriptor_d39ad626ec0e575e) } + +var fileDescriptor_d39ad626ec0e575e = []byte{ + // 387 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x92, 0x3d, 0x6e, 0xdb, 0x30, + 0x14, 0xc7, 0x4b, 0x57, 0x36, 0x2a, 0xba, 0x43, 0xc1, 0xba, 0xa8, 0x2b, 0x14, 0x92, 0x40, 0x14, + 0xa8, 0x97, 0x4a, 0xa8, 0xdb, 0xa1, 0xed, 0xd0, 0x41, 0x8b, 0x91, 0x21, 0x80, 0xc0, 0x78, 0xca, + 0x22, 0xd0, 0x21, 0x4d, 0x10, 0x90, 0x4c, 0xc5, 0xa2, 0x93, 0x29, 0x77, 0xc8, 0x98, 0x23, 0x65, + 0xcc, 0x09, 0x9c, 0xc0, 0xb9, 0x81, 0x4f, 0x10, 0x90, 0xf2, 0x57, 0x10, 0xe4, 0x03, 0xc8, 0x46, + 0x42, 0xff, 0xdf, 0xe3, 0xef, 0x3d, 0x3d, 0xf8, 0x7e, 0x2c, 0x79, 0xce, 0xaa, 0xa8, 0x9c, 0x2a, + 0xad, 0x90, 0x27, 0xa6, 0xe5, 0x51, 0x56, 0x48, 0xc6, 0x72, 0x7e, 0x4a, 0xa7, 0x3c, 0x12, 0x4a, + 0x28, 0xcd, 0x2b, 0x5d, 0x8e, 0xbc, 0x8e, 0x39, 0xdb, 0x58, 0x6c, 0x4e, 0x35, 0xe1, 0x05, 0x42, + 0x29, 0x91, 0xf3, 0xd8, 0xde, 0x46, 0xb3, 0x71, 0xac, 0x65, 0xc1, 0x2b, 0x4d, 0x8b, 0xb2, 0x0e, + 0xe0, 0xbf, 0xf0, 0xdd, 0x3e, 0xd7, 0x94, 0x51, 0x4d, 0xd1, 0x0f, 0xe8, 0x68, 0x2a, 0xaa, 0x2e, + 0x08, 0xdf, 0xf6, 0xdc, 0xe4, 0xcb, 0x72, 0x1e, 0x7c, 0xca, 0x95, 0xc8, 0xac, 0xc2, 0x3f, 0x5c, + 0x70, 0x4d, 0x33, 0xf3, 0x1d, 0x13, 0x1b, 0xc3, 0x3f, 0x61, 0x2b, 0x95, 0x13, 0xb1, 0xc7, 0xd0, + 0x77, 0xd8, 0x90, 0xac, 0x0b, 0x42, 0xd0, 0x6b, 0x26, 0x9f, 0x97, 0xf3, 0xe0, 0xe3, 0x0e, 0x56, + 0xca, 0x89, 0xc8, 0x24, 0xc3, 0xa4, 0x21, 0x19, 0x4e, 0xa1, 0x63, 0x10, 0xd4, 0xdf, 0x00, 0xed, + 0x3e, 0x8e, 0x1e, 0xef, 0x2a, 0xaa, 0x1f, 0x30, 0x2c, 0xea, 0xc0, 0xe6, 0x09, 0xcd, 0x67, 0xbc, + 0xdb, 0x08, 0x41, 0xcf, 0x25, 0xf5, 0x05, 0x9f, 0xc1, 0xb6, 0xc9, 0x10, 0x7e, 0x3c, 0xe3, 0x95, + 0x46, 0xbf, 0xa1, 0x63, 0x1e, 0x5c, 0x95, 0x0e, 0x9f, 0x2b, 0x4d, 0x6c, 0x1a, 0xfd, 0x81, 0x8e, + 0xe9, 0xce, 0x56, 0x6e, 0xf7, 0xbf, 0x3d, 0x45, 0xad, 0x87, 0x45, 0x2c, 0x81, 0x63, 0xe8, 0xa4, + 0x6a, 0x22, 0x76, 0x26, 0xe0, 0x3e, 0x9c, 0x80, 0xda, 0x99, 0x80, 0xf1, 0x55, 0xf7, 0x7d, 0xd5, + 0x0b, 0x7d, 0x95, 0xf5, 0x55, 0xaf, 0xf2, 0x25, 0xf0, 0xc3, 0x40, 0x0d, 0x54, 0x6a, 0xfe, 0xfd, + 0x81, 0x66, 0x43, 0x59, 0x70, 0xf4, 0x1f, 0xba, 0x9b, 0xad, 0x58, 0x89, 0x78, 0x51, 0xbd, 0x37, + 0xd1, 0x7a, 0x6f, 0xa2, 0xe1, 0x3a, 0x91, 0x38, 0xe7, 0xd7, 0x01, 0x20, 0x5b, 0x24, 0xf9, 0x7a, + 0xb9, 0xf0, 0xc1, 0xd5, 0xc2, 0x07, 0x37, 0x0b, 0x1f, 0x5c, 0xdc, 0xfa, 0x6f, 0x0e, 0xe1, 0x56, + 0x60, 0xd4, 0xb2, 0x25, 0x7e, 0xdd, 0x05, 0x00, 0x00, 0xff, 0xff, 0x28, 0x7e, 0xe2, 0x59, 0xca, + 0x02, 0x00, 0x00, +} + +func (m *Metadata) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Metadata) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Tags) > 0 { + for _, s := range m.Tags { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PingId) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PingId) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Id != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintFields(dAtA, i, uint64(m.Id)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Ping) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Ping) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Id != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintFields(dAtA, i, uint64(m.Id.Size())) + n1, err := m.Id.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + } + if len(m.Value) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintFields(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PingRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PingRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Ping != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintFields(dAtA, i, uint64(m.Ping.Size())) + n2, err := m.Ping.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + if m.Meta != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintFields(dAtA, i, uint64(m.Meta.Size())) + n3, err := m.Meta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *Pong) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Pong) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintFields(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PongRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PongRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Pong != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintFields(dAtA, i, uint64(m.Pong.Size())) + n4, err := m.Pong.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + if m.Meta != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintFields(dAtA, i, uint64(m.Meta.Size())) + n5, err := m.Meta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *GoGoProtoStdTime) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GoGoProtoStdTime) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Timestamp != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintFields(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(*m.Timestamp))) + n6, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Timestamp, dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func encodeVarintFields(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Metadata) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Tags) > 0 { + for _, s := range m.Tags { + l = len(s) + n += 1 + l + sovFields(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PingId) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Id != 0 { + n += 1 + sovFields(uint64(m.Id)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Ping) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Id != nil { + l = m.Id.Size() + n += 1 + l + sovFields(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovFields(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PingRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Ping != nil { + l = m.Ping.Size() + n += 1 + l + sovFields(uint64(l)) + } + if m.Meta != nil { + l = m.Meta.Size() + n += 1 + l + sovFields(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Pong) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovFields(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PongRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Pong != nil { + l = m.Pong.Size() + n += 1 + l + sovFields(uint64(l)) + } + if m.Meta != nil { + l = m.Meta.Size() + n += 1 + l + sovFields(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GoGoProtoStdTime) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Timestamp != nil { + l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.Timestamp) + n += 1 + l + sovFields(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovFields(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozFields(x uint64) (n int) { + return sovFields(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Metadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Metadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Metadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tags", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tags = append(m.Tags, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipFields(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingId) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PingId: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PingId: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + m.Id = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Id |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipFields(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ping) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Ping: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ping: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Id == nil { + m.Id = &PingId{} + } + if err := m.Id.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipFields(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PingRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PingRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ping", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ping == nil { + m.Ping = &Ping{} + } + if err := m.Ping.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Meta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Meta == nil { + m.Meta = &Metadata{} + } + if err := m.Meta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipFields(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Pong) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Pong: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Pong: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipFields(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PongRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PongRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PongRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pong", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pong == nil { + m.Pong = &Pong{} + } + if err := m.Pong.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Meta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Meta == nil { + m.Meta = &Metadata{} + } + if err := m.Meta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipFields(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GoGoProtoStdTime) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GoGoProtoStdTime: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GoGoProtoStdTime: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowFields + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthFields + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthFields + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Timestamp == nil { + m.Timestamp = new(time.Time) + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.Timestamp, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipFields(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthFields + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipFields(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFields + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFields + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFields + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthFields + } + iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthFields + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowFields + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipFields(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthFields + } + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthFields = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowFields = fmt.Errorf("proto: integer overflow") +) diff --git a/pkg/tracing/tracing_middleware/grpctesting/gogotestpb/fields.proto b/pkg/tracing/tracing_middleware/grpctesting/gogotestpb/fields.proto new file mode 100644 index 0000000000..1c7546dffc --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/gogotestpb/fields.proto @@ -0,0 +1,50 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +syntax = "proto3"; + +// This file is used for grpctesting discovery of log fields from requests using reflection and gogo proto more tags. +package grpc_middleware.gogotestpb; + +import "gogoproto/gogo.proto"; +import "google/protobuf/timestamp.proto"; + +option (gogoproto.gogoproto_import) = false; + +option go_package = "gogotestpb"; + +message Metadata { + repeated string tags = 1 [(gogoproto.moretags) = "log_field:\"meta_tags\""]; +} + +message PingId { + int32 id = 1 [(gogoproto.moretags) = "log_field:\"ping_id\""]; +} + +message Ping { + PingId id = 1; + string value = 2; +} + +message PingRequest { + Ping ping = 1; + Metadata meta = 2; +} + +message Pong { + string id = 1 [(gogoproto.moretags) = "log_field:\"pong_id\""]; +} + +message PongRequest { + Pong pong = 1; + Metadata meta = 2; +} + +message GoGoProtoStdTime { + google.protobuf.Timestamp timestamp = 1 [(gogoproto.stdtime) = true]; +} diff --git a/pkg/tracing/tracing_middleware/grpctesting/interceptor_suite.go b/pkg/tracing/tracing_middleware/grpctesting/interceptor_suite.go new file mode 100644 index 0000000000..15856885f2 --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/interceptor_suite.go @@ -0,0 +1,209 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package grpctesting + +import ( + "context" + "crypto/rand" + "crypto/rsa" + "crypto/tls" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "flag" + "math/big" + "net" + "sync" + "time" + + "google.golang.org/grpc/credentials/insecure" + + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "github.com/thanos-io/thanos/pkg/tracing/tracing_middleware/grpctesting/testpb" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +var ( + flagTls = flag.Bool("use_tls", true, "whether all gRPC middleware tests should use tls") + certPEM []byte + keyPEM []byte +) + +// InterceptorTestSuite is a testify/Suite that starts a gRPC PingService server and a client. +type InterceptorTestSuite struct { + suite.Suite + + TestService testpb.TestServiceServer + ServerOpts []grpc.ServerOption + ClientOpts []grpc.DialOption + + serverAddr string + ServerListener net.Listener + Server *grpc.Server + clientConn *grpc.ClientConn + Client testpb.TestServiceClient + + restartServerWithDelayedStart chan time.Duration + serverRunning chan bool + + cancels []context.CancelFunc +} + +func (s *InterceptorTestSuite) SetupSuite() { + s.restartServerWithDelayedStart = make(chan time.Duration) + s.serverRunning = make(chan bool) + + s.serverAddr = "127.0.0.1:0" + var err error + certPEM, keyPEM, err = generateCertAndKey([]string{"localhost", "example.com"}) + require.NoError(s.T(), err, "unable to generate test certificate/key") + + go func() { + for { + var err error + s.ServerListener, err = net.Listen("tcp", s.serverAddr) + s.serverAddr = s.ServerListener.Addr().String() + require.NoError(s.T(), err, "must be able to allocate a port for serverListener") + if *flagTls { + cert, err := tls.X509KeyPair(certPEM, keyPEM) + require.NoError(s.T(), err, "unable to load test TLS certificate") + creds := credentials.NewServerTLSFromCert(&cert) + s.ServerOpts = append(s.ServerOpts, grpc.Creds(creds)) + } + // This is the point where we hook up the interceptor. + s.Server = grpc.NewServer(s.ServerOpts...) + // Create a service if the instantiator hasn't provided one. + if s.TestService == nil { + s.TestService = &TestPingService{T: s.T()} + } + testpb.RegisterTestServiceServer(s.Server, s.TestService) + + w := sync.WaitGroup{} + w.Add(1) + go func() { + _ = s.Server.Serve(s.ServerListener) + w.Done() + }() + if s.Client == nil { + s.Client = s.NewClient(s.ClientOpts...) + } + + s.serverRunning <- true + + d := <-s.restartServerWithDelayedStart + s.Server.Stop() + time.Sleep(d) + w.Wait() + } + }() + + select { + case <-s.serverRunning: + case <-time.After(2 * time.Second): + s.T().Fatal("server failed to start before deadline") + } +} + +func (s *InterceptorTestSuite) RestartServer(delayedStart time.Duration) <-chan bool { + s.restartServerWithDelayedStart <- delayedStart + time.Sleep(10 * time.Millisecond) + return s.serverRunning +} + +func (s *InterceptorTestSuite) NewClient(dialOpts ...grpc.DialOption) testpb.TestServiceClient { + var err error + if *flagTls { + cp := x509.NewCertPool() + if !cp.AppendCertsFromPEM(certPEM) { + s.T().Fatal("failed to append certificate") + } + creds := credentials.NewTLS(&tls.Config{ServerName: "localhost", RootCAs: cp}) + dialOpts = append(dialOpts, grpc.WithTransportCredentials(creds)) + } else { + dialOpts = append(dialOpts, grpc.WithTransportCredentials(insecure.NewCredentials())) + } + s.clientConn, err = grpc.NewClient(s.ServerAddr(), dialOpts...) + require.NoError(s.T(), err, "must not error on client Dial") + return testpb.NewTestServiceClient(s.clientConn) +} + +func (s *InterceptorTestSuite) ServerAddr() string { + return s.serverAddr +} + +func (s *InterceptorTestSuite) SimpleCtx() context.Context { + ctx, cancel := context.WithTimeout(context.TODO(), 2*time.Second) + s.cancels = append(s.cancels, cancel) + return ctx +} + +func (s *InterceptorTestSuite) DeadlineCtx(deadline time.Time) context.Context { + ctx, cancel := context.WithDeadline(context.TODO(), deadline) + s.cancels = append(s.cancels, cancel) + return ctx +} + +func (s *InterceptorTestSuite) TearDownSuite() { + time.Sleep(10 * time.Millisecond) + if s.ServerListener != nil { + s.Server.GracefulStop() + s.T().Logf("stopped grpc.Server at: %v", s.ServerAddr()) + _ = s.ServerListener.Close() + } + if s.clientConn != nil { + _ = s.clientConn.Close() + } + for _, c := range s.cancels { + c() + } +} + +// generateCertAndKey copied from https://github.com/johanbrandhorst/certify/blob/master/issuers/vault/vault_suite_test.go#L255 +// with minor modifications. +func generateCertAndKey(san []string) ([]byte, []byte, error) { + priv, err := rsa.GenerateKey(rand.Reader, 2048) + if err != nil { + return nil, nil, err + } + notBefore := time.Now() + notAfter := notBefore.Add(time.Hour) + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128) + serialNumber, err := rand.Int(rand.Reader, serialNumberLimit) + if err != nil { + return nil, nil, err + } + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: pkix.Name{ + CommonName: "example.com", + }, + NotBefore: notBefore, + NotAfter: notAfter, + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + BasicConstraintsValid: true, + DNSNames: san, + } + derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, priv.Public(), priv) + if err != nil { + return nil, nil, err + } + certOut := pem.EncodeToMemory(&pem.Block{ + Type: "CERTIFICATE", + Bytes: derBytes, + }) + keyOut := pem.EncodeToMemory(&pem.Block{ + Type: "RSA PRIVATE KEY", + Bytes: x509.MarshalPKCS1PrivateKey(priv), + }) + + return certOut, keyOut, nil +} diff --git a/pkg/tracing/tracing_middleware/grpctesting/mutex_readerwriter.go b/pkg/tracing/tracing_middleware/grpctesting/mutex_readerwriter.go new file mode 100644 index 0000000000..44ed5249c8 --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/mutex_readerwriter.go @@ -0,0 +1,39 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package grpctesting + +import ( + "io" + "sync" +) + +// MutexReadWriter is a io.ReadWriter that can be read and worked on from multiple go routines. +type MutexReadWriter struct { + sync.Mutex + rw io.ReadWriter +} + +// NewMutexReadWriter creates a new thread-safe io.ReadWriter. +func NewMutexReadWriter(rw io.ReadWriter) *MutexReadWriter { + return &MutexReadWriter{rw: rw} +} + +// Write implements the io.Writer interface. +func (m *MutexReadWriter) Write(p []byte) (int, error) { + m.Lock() + defer m.Unlock() + return m.rw.Write(p) +} + +// Read implements the io.Reader interface. +func (m *MutexReadWriter) Read(p []byte) (int, error) { + m.Lock() + defer m.Unlock() + return m.rw.Read(p) +} diff --git a/pkg/tracing/tracing_middleware/grpctesting/pingservice.go b/pkg/tracing/tracing_middleware/grpctesting/pingservice.go new file mode 100644 index 0000000000..6d64ed6d7c --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/pingservice.go @@ -0,0 +1,81 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +/* +Package `grpc_testing` provides helper functions for testing validators in this package. +*/ + +package grpctesting + +import ( + "context" + "io" + "testing" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/thanos-io/thanos/pkg/tracing/tracing_middleware/grpctesting/testpb" +) + +const ( + // DefaultPongValue is the default value used. + DefaultResponseValue = "default_response_value" + // ListResponseCount is the expected number of responses to PingList. + ListResponseCount = 100 +) + +type TestPingService struct { + T *testing.T +} + +func (s *TestPingService) PingEmpty(_ context.Context, _ *testpb.Empty) (*testpb.PingResponse, error) { + return &testpb.PingResponse{Value: DefaultResponseValue, Counter: 0}, nil +} + +func (s *TestPingService) Ping(_ context.Context, ping *testpb.PingRequest) (*testpb.PingResponse, error) { + // Send user trailers and headers. + return &testpb.PingResponse{Value: ping.Value, Counter: 0}, nil +} + +func (s *TestPingService) PingError(_ context.Context, ping *testpb.PingRequest) (*testpb.Empty, error) { + code := codes.Code(ping.ErrorCodeReturned) + return nil, status.Errorf(code, "Userspace error.") +} + +func (s *TestPingService) PingList(ping *testpb.PingRequest, stream testpb.TestService_PingListServer) error { + if ping.ErrorCodeReturned != 0 { + return status.Errorf(codes.Code(ping.ErrorCodeReturned), "foobar") + } + // Send user trailers and headers. + for i := 0; i < ListResponseCount; i++ { + if err := stream.Send(&testpb.PingResponse{Value: ping.Value, Counter: int32(i)}); err != nil { + return err + } + } + return nil +} + +func (s *TestPingService) PingStream(stream testpb.TestService_PingStreamServer) error { + count := 0 + for { + ping, err := stream.Recv() + if err == io.EOF { + break + } + if err != nil { + return err + } + if err := stream.Send(&testpb.PingResponse{Value: ping.Value, Counter: int32(count)}); err != nil { + return err + } + + count += 1 + } + return nil +} diff --git a/pkg/tracing/tracing_middleware/grpctesting/testpb/test.manual_extractfields.pb.go b/pkg/tracing/tracing_middleware/grpctesting/testpb/test.manual_extractfields.pb.go new file mode 100644 index 0000000000..ab1f0191c7 --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/testpb/test.manual_extractfields.pb.go @@ -0,0 +1,10 @@ +// Manual code for logging field extraction tests. + +package testpb + +const TestServiceFullName = "grpc_middleware.testpb.TestService" + +// This is implementing tags.requestFieldsExtractor. +func (m *PingRequest) ExtractRequestFields(appendToMap map[string]string) { + appendToMap["value"] = m.Value +} diff --git a/pkg/tracing/tracing_middleware/grpctesting/testpb/test.manual_validator.pb.go b/pkg/tracing/tracing_middleware/grpctesting/testpb/test.manual_validator.pb.go new file mode 100644 index 0000000000..f123c70b76 --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/testpb/test.manual_validator.pb.go @@ -0,0 +1,12 @@ +// Manual code for validation tests. + +package testpb + +import "github.com/pkg/errors" + +func (m *PingRequest) Validate() error { + if m.SleepTimeMs > 10000 { + return errors.New("cannot sleep for more than 10s") + } + return nil +} diff --git a/pkg/tracing/tracing_middleware/grpctesting/testpb/test.pb.go b/pkg/tracing/tracing_middleware/grpctesting/testpb/test.pb.go new file mode 100644 index 0000000000..bba2dd4f3a --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/testpb/test.pb.go @@ -0,0 +1,1037 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: test.proto + +package testpb + +import ( + context "context" + fmt "fmt" + io "io" + math "math" + + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +type Empty struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_c161fcfdc0c3ff1e, []int{0} +} +func (m *Empty) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(m, src) +} +func (m *Empty) XXX_Size() int { + return m.Size() +} +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) +} + +var xxx_messageInfo_Empty proto.InternalMessageInfo + +type PingRequest struct { + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + SleepTimeMs int32 `protobuf:"varint,2,opt,name=sleep_time_ms,json=sleepTimeMs,proto3" json:"sleep_time_ms,omitempty"` + ErrorCodeReturned uint32 `protobuf:"varint,3,opt,name=error_code_returned,json=errorCodeReturned,proto3" json:"error_code_returned,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PingRequest) Reset() { *m = PingRequest{} } +func (m *PingRequest) String() string { return proto.CompactTextString(m) } +func (*PingRequest) ProtoMessage() {} +func (*PingRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_c161fcfdc0c3ff1e, []int{1} +} +func (m *PingRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PingRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PingRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PingRequest.Merge(m, src) +} +func (m *PingRequest) XXX_Size() int { + return m.Size() +} +func (m *PingRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PingRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PingRequest proto.InternalMessageInfo + +func (m *PingRequest) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (m *PingRequest) GetSleepTimeMs() int32 { + if m != nil { + return m.SleepTimeMs + } + return 0 +} + +func (m *PingRequest) GetErrorCodeReturned() uint32 { + if m != nil { + return m.ErrorCodeReturned + } + return 0 +} + +type PingResponse struct { + Value string `protobuf:"bytes,1,opt,name=Value,proto3" json:"Value,omitempty"` + Counter int32 `protobuf:"varint,2,opt,name=counter,proto3" json:"counter,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PingResponse) Reset() { *m = PingResponse{} } +func (m *PingResponse) String() string { return proto.CompactTextString(m) } +func (*PingResponse) ProtoMessage() {} +func (*PingResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_c161fcfdc0c3ff1e, []int{2} +} +func (m *PingResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PingResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PingResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_PingResponse.Merge(m, src) +} +func (m *PingResponse) XXX_Size() int { + return m.Size() +} +func (m *PingResponse) XXX_DiscardUnknown() { + xxx_messageInfo_PingResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_PingResponse proto.InternalMessageInfo + +func (m *PingResponse) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (m *PingResponse) GetCounter() int32 { + if m != nil { + return m.Counter + } + return 0 +} + +func init() { + proto.RegisterType((*Empty)(nil), "grpc_middleware.testpb.Empty") + proto.RegisterType((*PingRequest)(nil), "grpc_middleware.testpb.PingRequest") + proto.RegisterType((*PingResponse)(nil), "grpc_middleware.testpb.PingResponse") +} + +func init() { proto.RegisterFile("test.proto", fileDescriptor_c161fcfdc0c3ff1e) } + +var fileDescriptor_c161fcfdc0c3ff1e = []byte{ + // 320 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x52, 0xcd, 0x4a, 0x33, 0x31, + 0x14, 0x6d, 0xbe, 0x7e, 0x6d, 0xed, 0xad, 0x5d, 0x18, 0x8b, 0x0c, 0x82, 0xa5, 0x44, 0x17, 0xb3, + 0x1a, 0x8a, 0xee, 0x5d, 0x28, 0xee, 0x14, 0x34, 0x2d, 0x82, 0x82, 0x0c, 0xed, 0xcc, 0xa5, 0x04, + 0x9a, 0x49, 0x4c, 0x32, 0x2d, 0x3e, 0x9f, 0x1b, 0x97, 0x3e, 0x82, 0xf4, 0x49, 0x24, 0x69, 0x85, + 0x2e, 0xb4, 0x74, 0xd1, 0xe5, 0x3d, 0xe7, 0x70, 0x7e, 0x42, 0x00, 0x1c, 0x5a, 0x97, 0x68, 0xa3, + 0x9c, 0xa2, 0x47, 0x13, 0xa3, 0xb3, 0x54, 0x8a, 0x3c, 0x9f, 0xe2, 0x7c, 0x64, 0x30, 0xf1, 0x9c, + 0x1e, 0xb3, 0x06, 0xd4, 0x6e, 0xa4, 0x76, 0x6f, 0x6c, 0x0e, 0xad, 0x7b, 0x51, 0x4c, 0x38, 0xbe, + 0x96, 0x68, 0x1d, 0xed, 0x40, 0x6d, 0x36, 0x9a, 0x96, 0x18, 0x91, 0x1e, 0x89, 0x9b, 0x7c, 0x79, + 0x50, 0x06, 0x6d, 0x3b, 0x45, 0xd4, 0xa9, 0x13, 0x12, 0x53, 0x69, 0xa3, 0x7f, 0x3d, 0x12, 0xd7, + 0x78, 0x2b, 0x80, 0x43, 0x21, 0xf1, 0xce, 0xd2, 0x04, 0x0e, 0xd1, 0x18, 0x65, 0xd2, 0x4c, 0xe5, + 0x98, 0x1a, 0x74, 0xa5, 0x29, 0x30, 0x8f, 0xaa, 0x3d, 0x12, 0xb7, 0xf9, 0x41, 0xa0, 0xae, 0x55, + 0x8e, 0x7c, 0x45, 0xb0, 0x4b, 0xd8, 0x5f, 0x06, 0x5b, 0xad, 0x0a, 0x8b, 0x3e, 0xf9, 0x71, 0x3d, + 0x39, 0x1c, 0x34, 0x82, 0x46, 0xa6, 0xca, 0xc2, 0xa1, 0x59, 0x65, 0xfe, 0x9c, 0xe7, 0xef, 0x55, + 0x68, 0x0d, 0xd1, 0xba, 0x01, 0x9a, 0x99, 0xc8, 0x90, 0x72, 0x68, 0x7a, 0xbf, 0xb0, 0x8a, 0x9e, + 0x24, 0xbf, 0xef, 0x4e, 0x02, 0x7d, 0x7c, 0xf6, 0x17, 0xbd, 0xde, 0x88, 0x55, 0xe8, 0x00, 0xfe, + 0x7b, 0x84, 0x9e, 0x6e, 0xd6, 0x87, 0xa7, 0xdb, 0xda, 0xf4, 0x61, 0x55, 0xd4, 0xbf, 0xc8, 0x76, + 0xce, 0x9b, 0xd7, 0xb0, 0x0a, 0x7d, 0x82, 0x3d, 0xaf, 0xbf, 0x15, 0xd6, 0xed, 0xb4, 0x6b, 0x9f, + 0xd0, 0x17, 0x00, 0x8f, 0x0d, 0x9c, 0xc1, 0x91, 0xdc, 0xa9, 0x79, 0x4c, 0xfa, 0xe4, 0xaa, 0xf3, + 0xb1, 0xe8, 0x92, 0xcf, 0x45, 0x97, 0x7c, 0x2d, 0xba, 0xe4, 0xb9, 0xbe, 0x14, 0x8e, 0xeb, 0xe1, + 0xf3, 0x5e, 0x7c, 0x07, 0x00, 0x00, 0xff, 0xff, 0x92, 0x21, 0xeb, 0x3f, 0xca, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// TestServiceClient is the client API for TestService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type TestServiceClient interface { + PingEmpty(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PingResponse, error) + Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) + PingError(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*Empty, error) + PingList(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (TestService_PingListClient, error) + PingStream(ctx context.Context, opts ...grpc.CallOption) (TestService_PingStreamClient, error) +} + +type testServiceClient struct { + cc *grpc.ClientConn +} + +func NewTestServiceClient(cc *grpc.ClientConn) TestServiceClient { + return &testServiceClient{cc} +} + +func (c *testServiceClient) PingEmpty(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PingResponse, error) { + out := new(PingResponse) + err := c.cc.Invoke(ctx, "/grpc_middleware.testpb.TestService/PingEmpty", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *testServiceClient) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) { + out := new(PingResponse) + err := c.cc.Invoke(ctx, "/grpc_middleware.testpb.TestService/Ping", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *testServiceClient) PingError(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/grpc_middleware.testpb.TestService/PingError", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *testServiceClient) PingList(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (TestService_PingListClient, error) { + stream, err := c.cc.NewStream(ctx, &_TestService_serviceDesc.Streams[0], "/grpc_middleware.testpb.TestService/PingList", opts...) + if err != nil { + return nil, err + } + x := &testServicePingListClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type TestService_PingListClient interface { + Recv() (*PingResponse, error) + grpc.ClientStream +} + +type testServicePingListClient struct { + grpc.ClientStream +} + +func (x *testServicePingListClient) Recv() (*PingResponse, error) { + m := new(PingResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *testServiceClient) PingStream(ctx context.Context, opts ...grpc.CallOption) (TestService_PingStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &_TestService_serviceDesc.Streams[1], "/grpc_middleware.testpb.TestService/PingStream", opts...) + if err != nil { + return nil, err + } + x := &testServicePingStreamClient{stream} + return x, nil +} + +type TestService_PingStreamClient interface { + Send(*PingRequest) error + Recv() (*PingResponse, error) + grpc.ClientStream +} + +type testServicePingStreamClient struct { + grpc.ClientStream +} + +func (x *testServicePingStreamClient) Send(m *PingRequest) error { + return x.ClientStream.SendMsg(m) +} + +func (x *testServicePingStreamClient) Recv() (*PingResponse, error) { + m := new(PingResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// TestServiceServer is the server API for TestService service. +type TestServiceServer interface { + PingEmpty(context.Context, *Empty) (*PingResponse, error) + Ping(context.Context, *PingRequest) (*PingResponse, error) + PingError(context.Context, *PingRequest) (*Empty, error) + PingList(*PingRequest, TestService_PingListServer) error + PingStream(TestService_PingStreamServer) error +} + +func RegisterTestServiceServer(s *grpc.Server, srv TestServiceServer) { + s.RegisterService(&_TestService_serviceDesc, srv) +} + +func _TestService_PingEmpty_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TestServiceServer).PingEmpty(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/grpc_middleware.testpb.TestService/PingEmpty", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TestServiceServer).PingEmpty(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _TestService_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TestServiceServer).Ping(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/grpc_middleware.testpb.TestService/Ping", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TestServiceServer).Ping(ctx, req.(*PingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TestService_PingError_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PingRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TestServiceServer).PingError(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/grpc_middleware.testpb.TestService/PingError", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TestServiceServer).PingError(ctx, req.(*PingRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TestService_PingList_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(PingRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(TestServiceServer).PingList(m, &testServicePingListServer{stream}) +} + +type TestService_PingListServer interface { + Send(*PingResponse) error + grpc.ServerStream +} + +type testServicePingListServer struct { + grpc.ServerStream +} + +func (x *testServicePingListServer) Send(m *PingResponse) error { + return x.ServerStream.SendMsg(m) +} + +func _TestService_PingStream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(TestServiceServer).PingStream(&testServicePingStreamServer{stream}) +} + +type TestService_PingStreamServer interface { + Send(*PingResponse) error + Recv() (*PingRequest, error) + grpc.ServerStream +} + +type testServicePingStreamServer struct { + grpc.ServerStream +} + +func (x *testServicePingStreamServer) Send(m *PingResponse) error { + return x.ServerStream.SendMsg(m) +} + +func (x *testServicePingStreamServer) Recv() (*PingRequest, error) { + m := new(PingRequest) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +var _TestService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "grpc_middleware.testpb.TestService", + HandlerType: (*TestServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "PingEmpty", + Handler: _TestService_PingEmpty_Handler, + }, + { + MethodName: "Ping", + Handler: _TestService_Ping_Handler, + }, + { + MethodName: "PingError", + Handler: _TestService_PingError_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "PingList", + Handler: _TestService_PingList_Handler, + ServerStreams: true, + }, + { + StreamName: "PingStream", + Handler: _TestService_PingStream_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "test.proto", +} + +func (m *Empty) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Empty) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PingRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PingRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Value) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintTest(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if m.SleepTimeMs != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintTest(dAtA, i, uint64(m.SleepTimeMs)) + } + if m.ErrorCodeReturned != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintTest(dAtA, i, uint64(m.ErrorCodeReturned)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *PingResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PingResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Value) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintTest(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if m.Counter != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintTest(dAtA, i, uint64(m.Counter)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func encodeVarintTest(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Empty) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PingRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTest(uint64(l)) + } + if m.SleepTimeMs != 0 { + n += 1 + sovTest(uint64(m.SleepTimeMs)) + } + if m.ErrorCodeReturned != 0 { + n += 1 + sovTest(uint64(m.ErrorCodeReturned)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *PingResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Value) + if l > 0 { + n += 1 + l + sovTest(uint64(l)) + } + if m.Counter != 0 { + n += 1 + sovTest(uint64(m.Counter)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovTest(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozTest(x uint64) (n int) { + return sovTest(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Empty) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Empty: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTest(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PingRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PingRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTest + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTest + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SleepTimeMs", wireType) + } + m.SleepTimeMs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SleepTimeMs |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ErrorCodeReturned", wireType) + } + m.ErrorCodeReturned = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ErrorCodeReturned |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTest(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PingResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PingResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PingResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTest + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTest + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Counter", wireType) + } + m.Counter = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTest + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Counter |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTest(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTest + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTest(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTest + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTest + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTest + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTest + } + iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthTest + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTest + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipTest(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthTest + } + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthTest = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTest = fmt.Errorf("proto: integer overflow") +) diff --git a/pkg/tracing/tracing_middleware/grpctesting/testpb/test.proto b/pkg/tracing/tracing_middleware/grpctesting/testpb/test.proto new file mode 100644 index 0000000000..5c0d0b3af5 --- /dev/null +++ b/pkg/tracing/tracing_middleware/grpctesting/testpb/test.proto @@ -0,0 +1,40 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +syntax = "proto3"; + +package grpc_middleware.testpb; + +option go_package = "testpb"; + +message Empty { +} + +message PingRequest { + string value = 1; + int32 sleep_time_ms = 2; + uint32 error_code_returned = 3; +} + +message PingResponse { + string Value = 1; + int32 counter = 2; +} + +service TestService { + rpc PingEmpty(Empty) returns (PingResponse) {} + + rpc Ping(PingRequest) returns (PingResponse) {} + + rpc PingError(PingRequest) returns (Empty) {} + + rpc PingList(PingRequest) returns (stream PingResponse) {} + + rpc PingStream(stream PingRequest) returns (stream PingResponse) {} + +} diff --git a/pkg/tracing/tracing_middleware/interceptors_test.go b/pkg/tracing/tracing_middleware/interceptors_test.go new file mode 100644 index 0000000000..39f6b4d451 --- /dev/null +++ b/pkg/tracing/tracing_middleware/interceptors_test.go @@ -0,0 +1,266 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package tracing_middleware_test + +import ( + "context" + "fmt" + + "github.com/thanos-io/thanos/pkg/tracing/tracing_middleware" + "github.com/thanos-io/thanos/pkg/tracing/tracing_middleware/grpctesting" + + "io" + "net/http" + "strconv" + "strings" + "testing" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/mocktracer" + "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + + "github.com/thanos-io/thanos/pkg/tracing/tracing_middleware/grpctesting/testpb" +) + +var ( + goodPing = &testpb.PingRequest{Value: "something", SleepTimeMs: 9999} + fakeInboundTraceId = 1337 + fakeInboundSpanId = 999 + traceHeaderName = "uber-trace-id" +) + +type tracingAssertService struct { + testpb.TestServiceServer + T *testing.T +} + +func (s *tracingAssertService) PingError(ctx context.Context, ping *testpb.PingRequest) (*testpb.Empty, error) { + assert.NotNil(s.T, opentracing.SpanFromContext(ctx), "handlers must have the spancontext in their context, otherwise propagation will fail") + return s.TestServiceServer.PingError(ctx, ping) +} + +func TestTaggingSuite(t *testing.T) { + mockTracer := mocktracer.New() + opts := []tracing_middleware.Option{ + tracing_middleware.WithTracer(mockTracer), + tracing_middleware.WithTraceHeaderName(traceHeaderName), + } + s := &OpentracingSuite{ + mockTracer: mockTracer, + InterceptorTestSuite: makeInterceptorTestSuite(t, opts), + } + suite.Run(t, s) +} + +func TestTaggingSuiteJaeger(t *testing.T) { + mockTracer := mocktracer.New() + mockTracer.RegisterInjector(opentracing.HTTPHeaders, jaegerFormatInjector{}) + mockTracer.RegisterExtractor(opentracing.HTTPHeaders, jaegerFormatExtractor{}) + opts := []tracing_middleware.Option{ + tracing_middleware.WithTracer(mockTracer), + } + s := &OpentracingSuite{ + mockTracer: mockTracer, + InterceptorTestSuite: makeInterceptorTestSuite(t, opts), + } + suite.Run(t, s) +} + +func makeInterceptorTestSuite(t *testing.T, opts []tracing_middleware.Option) *grpctesting.InterceptorTestSuite { + return &grpctesting.InterceptorTestSuite{ + TestService: &tracingAssertService{TestServiceServer: &grpctesting.TestPingService{T: t}, T: t}, + ClientOpts: []grpc.DialOption{ + grpc.WithUnaryInterceptor(tracing_middleware.UnaryClientInterceptor(opts...)), + grpc.WithStreamInterceptor(tracing_middleware.StreamClientInterceptor(opts...)), + }, + ServerOpts: []grpc.ServerOption{ + grpc.ChainStreamInterceptor( + //tags.StreamServerInterceptor(tags.WithFieldExtractor(tags.CodeGenRequestFieldExtractor)), + tracing_middleware.StreamServerInterceptor(opts...)), + grpc.ChainUnaryInterceptor( + //tags.UnaryServerInterceptor(tags.WithFieldExtractor(tags.CodeGenRequestFieldExtractor)), + tracing_middleware.UnaryServerInterceptor(opts...)), + }, + } +} + +type OpentracingSuite struct { + *grpctesting.InterceptorTestSuite + mockTracer *mocktracer.MockTracer +} + +func (s *OpentracingSuite) SetupTest() { + s.mockTracer.Reset() +} + +func (s *OpentracingSuite) createContextFromFakeHttpRequestParent(ctx context.Context, sampled bool) context.Context { + jFlag := 0 + if sampled { + jFlag = 1 + } + + hdr := http.Header{} + hdr.Set(traceHeaderName, fmt.Sprintf("%d:%d:%d:%d", fakeInboundTraceId, fakeInboundSpanId, fakeInboundSpanId, jFlag)) + hdr.Set("mockpfx-ids-traceid", fmt.Sprint(fakeInboundTraceId)) + hdr.Set("mockpfx-ids-spanid", fmt.Sprint(fakeInboundSpanId)) + hdr.Set("mockpfx-ids-sampled", fmt.Sprint(sampled)) + + parentSpanContext, err := s.mockTracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(hdr)) + require.NoError(s.T(), err, "parsing a fake HTTP request headers shouldn't fail, ever") + fakeSpan := s.mockTracer.StartSpan( + "/fake/parent/http/request", + // this is magical, it attaches the new span to the parent parentSpanContext, and creates an unparented one if empty. + opentracing.ChildOf(parentSpanContext), + ) + fakeSpan.Finish() + return opentracing.ContextWithSpan(ctx, fakeSpan) +} + +func (s *OpentracingSuite) assertTracesCreated(methodName string) (clientSpan *mocktracer.MockSpan, serverSpan *mocktracer.MockSpan) { + spans := s.mockTracer.FinishedSpans() + for _, span := range spans { + s.T().Logf("span: %v, tags: %v", span, span.Tags()) + } + require.Len(s.T(), spans, 3, "should record 3 spans: one fake inbound, one client, one server") + traceIdAssert := fmt.Sprintf("traceId=%d", fakeInboundTraceId) + for _, span := range spans { + assert.Contains(s.T(), span.String(), traceIdAssert, "not part of the fake parent trace: %v", span) + if span.OperationName == methodName { + kind := fmt.Sprintf("%v", span.Tag("span.kind")) + if kind == "client" { + clientSpan = span + } else if kind == "server" { + serverSpan = span + } + assert.EqualValues(s.T(), span.Tag("component"), "gRPC", "span must be tagged with gRPC component") + } + } + require.NotNil(s.T(), clientSpan, "client span must be there") + require.NotNil(s.T(), serverSpan, "server span must be there") + //assert.EqualValues(s.T(), serverSpan.Tag("grpc.request.value"), "something", "tags must be propagated, in this case ones from request fields") + return clientSpan, serverSpan +} + +func (s *OpentracingSuite) TestPing_PropagatesTraces() { + ctx := s.createContextFromFakeHttpRequestParent(s.SimpleCtx(), true) + _, err := s.Client.Ping(ctx, goodPing) + require.NoError(s.T(), err, "there must be not be an on a successful call") + s.assertTracesCreated("/" + testpb.TestServiceFullName + "/Ping") +} + +func (s *OpentracingSuite) TestPing_ClientContextTags() { + const name = "opentracing.custom" + ctx := tracing_middleware.ClientAddContextTags( + s.createContextFromFakeHttpRequestParent(s.SimpleCtx(), true), + opentracing.Tags{name: ""}, + ) + + _, err := s.Client.Ping(ctx, goodPing) + require.NoError(s.T(), err, "there must be not be an on a successful call") + + for _, span := range s.mockTracer.FinishedSpans() { + if span.OperationName == "/"+testpb.TestServiceFullName+"/Ping" { + kind := fmt.Sprintf("%v", span.Tag("span.kind")) + if kind == "client" { + assert.Contains(s.T(), span.Tags(), name, "custom opentracing.Tags must be included in context") + } + } + } +} + +func (s *OpentracingSuite) TestPingList_PropagatesTraces() { + ctx := s.createContextFromFakeHttpRequestParent(s.SimpleCtx(), true) + stream, err := s.Client.PingList(ctx, goodPing) + require.NoError(s.T(), err, "should not fail on establishing the stream") + for { + _, err := stream.Recv() + if err == io.EOF { + break + } + require.NoError(s.T(), err, "reading stream should not fail") + } + s.assertTracesCreated("/" + testpb.TestServiceFullName + "/PingList") +} + +func (s *OpentracingSuite) TestPingError_PropagatesTraces() { + ctx := s.createContextFromFakeHttpRequestParent(s.SimpleCtx(), true) + erroringPing := &testpb.PingRequest{Value: "something", ErrorCodeReturned: uint32(codes.OutOfRange)} + _, err := s.Client.PingError(ctx, erroringPing) + require.Error(s.T(), err, "there must be an error returned here") + clientSpan, serverSpan := s.assertTracesCreated("/" + testpb.TestServiceFullName + "/PingError") + assert.Equal(s.T(), true, clientSpan.Tag("error"), "client span needs to be marked as an error") + assert.Equal(s.T(), true, serverSpan.Tag("error"), "server span needs to be marked as an error") +} + +func (s *OpentracingSuite) TestPingEmpty_NotSampleTraces() { + ctx := s.createContextFromFakeHttpRequestParent(s.SimpleCtx(), false) + _, err := s.Client.PingEmpty(ctx, &testpb.Empty{}) + require.NoError(s.T(), err, "there must be not be an on a successful call") +} + +type jaegerFormatInjector struct{} + +func (jaegerFormatInjector) Inject(ctx mocktracer.MockSpanContext, carrier interface{}) error { + w := carrier.(opentracing.TextMapWriter) + flags := 0 + if ctx.Sampled { + flags = 1 + } + w.Set(traceHeaderName, fmt.Sprintf("%d:%d::%d", ctx.TraceID, ctx.SpanID, flags)) + + return nil +} + +type jaegerFormatExtractor struct{} + +func (jaegerFormatExtractor) Extract(carrier interface{}) (mocktracer.MockSpanContext, error) { + rval := mocktracer.MockSpanContext{Sampled: true} + reader, ok := carrier.(opentracing.TextMapReader) + if !ok { + return rval, opentracing.ErrInvalidCarrier + } + err := reader.ForeachKey(func(key, val string) error { + lowerKey := strings.ToLower(key) + switch { + case lowerKey == traceHeaderName: + parts := strings.Split(val, ":") + if len(parts) != 4 { + return errors.New("invalid trace id format") + } + traceId, err := strconv.Atoi(parts[0]) + if err != nil { + return err + } + rval.TraceID = traceId + spanId, err := strconv.Atoi(parts[1]) + if err != nil { + return err + } + rval.SpanID = spanId + flags, err := strconv.Atoi(parts[3]) + if err != nil { + return err + } + rval.Sampled = flags%2 == 1 + } + return nil + }) + if rval.TraceID == 0 || rval.SpanID == 0 { + return rval, opentracing.ErrSpanContextNotFound + } + if err != nil { + return rval, err + } + return rval, nil +} diff --git a/pkg/tracing/tracing_middleware/metadata.go b/pkg/tracing/tracing_middleware/metadata.go new file mode 100644 index 0000000000..8e3531ffde --- /dev/null +++ b/pkg/tracing/tracing_middleware/metadata.go @@ -0,0 +1,55 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package tracing_middleware + +import ( + "encoding/base64" + "strings" + + "google.golang.org/grpc/metadata" +) + +const ( + binHdrSuffix = "-bin" +) + +// metadataTextMap extends a metadata.MD to be an opentracing textmap. +type metadataTextMap metadata.MD + +// Set is a opentracing.TextMapReader interface that extracts values. +func (m metadataTextMap) Set(key, val string) { + // gRPC allows for complex binary values to be written. + encodedKey, encodedVal := encodeKeyValue(key, val) + // The metadata object is a multimap, and previous values may exist, but for opentracing headers, we do not append + // we just override. + m[encodedKey] = []string{encodedVal} +} + +// ForeachKey is a opentracing.TextMapReader interface that extracts values. +func (m metadataTextMap) ForeachKey(callback func(key, val string) error) error { + for k, vv := range m { + for _, v := range vv { + if err := callback(k, v); err != nil { + return err + } + } + } + return nil +} + +// encodeKeyValue encodes key and value qualified for transmission via gRPC. +// note: copy pasted from private values of grpc.metadata +func encodeKeyValue(k, v string) (string, string) { + k = strings.ToLower(k) + if strings.HasSuffix(k, binHdrSuffix) { + val := base64.StdEncoding.EncodeToString([]byte(v)) + v = string(val) + } + return k, v +} diff --git a/pkg/tracing/tracing_middleware/options.go b/pkg/tracing/tracing_middleware/options.go new file mode 100644 index 0000000000..d64e3a140b --- /dev/null +++ b/pkg/tracing/tracing_middleware/options.go @@ -0,0 +1,72 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package tracing_middleware + +import ( + "context" + + "github.com/opentracing/opentracing-go" +) + +var ( + defaultOptions = &options{ + filterOutFunc: nil, + tracer: nil, + } +) + +// FilterFunc allows users to provide a function that filters out certain methods from being traced. +// +// If it returns false, the given request will not be traced. +type FilterFunc func(ctx context.Context, fullMethodName string) bool + +type options struct { + filterOutFunc FilterFunc + tracer opentracing.Tracer + traceHeaderName string +} + +func evaluateOptions(opts []Option) *options { + optCopy := &options{} + *optCopy = *defaultOptions + for _, o := range opts { + o(optCopy) + } + if optCopy.tracer == nil { + optCopy.tracer = opentracing.GlobalTracer() + } + if optCopy.traceHeaderName == "" { + optCopy.traceHeaderName = "uber-trace-id" + } + return optCopy +} + +type Option func(*options) + +// WithFilterFunc customizes the function used for deciding whether a given call is traced or not. +func WithFilterFunc(f FilterFunc) Option { + return func(o *options) { + o.filterOutFunc = f + } +} + +// WithTraceHeaderName customizes the trace header name where trace metadata passed with requests. +// Default one is `uber-trace-id`. +func WithTraceHeaderName(name string) Option { + return func(o *options) { + o.traceHeaderName = name + } +} + +// WithTracer sets a custom tracer to be used for this middleware, otherwise the opentracing.GlobalTracer is used. +func WithTracer(tracer opentracing.Tracer) Option { + return func(o *options) { + o.tracer = tracer + } +} diff --git a/pkg/tracing/tracing_middleware/server.go b/pkg/tracing/tracing_middleware/server.go new file mode 100644 index 0000000000..bf5019248b --- /dev/null +++ b/pkg/tracing/tracing_middleware/server.go @@ -0,0 +1,94 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package tracing_middleware + +import ( + "context" + + "time" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/ext" + "github.com/opentracing/opentracing-go/log" + "google.golang.org/grpc" + "google.golang.org/grpc/grpclog" + + "github.com/thanos-io/thanos/pkg/tracing/interceptors" + "github.com/thanos-io/thanos/pkg/tracing/util/metautils" +) + +var ( + grpcTag = opentracing.Tag{Key: string(ext.Component), Value: "gRPC"} +) + +type opentracingServerReporter struct { + ctx context.Context + typ interceptors.GRPCType + service, method string + + serverSpan opentracing.Span +} + +func (o *opentracingServerReporter) PostCall(err error, _ time.Duration) { + if err != nil { + ext.Error.Set(o.serverSpan, true) + o.serverSpan.LogFields(log.String("event", "error"), log.String("message", err.Error())) + } + o.serverSpan.Finish() +} + +func (o *opentracingServerReporter) PostMsgSend(interface{}, error, time.Duration) {} + +func (o *opentracingServerReporter) PostMsgReceive(interface{}, error, time.Duration) {} + +type opentracingServerReportable struct { + tracer opentracing.Tracer + // This is only used for server. TODO: Investigate if needed in client. + traceHeaderName string + filterOutFunc FilterFunc +} + +func (o *opentracingServerReportable) ServerReporter(ctx context.Context, _ interface{}, typ interceptors.GRPCType, service string, method string) (interceptors.Reporter, context.Context) { + if o.filterOutFunc != nil && !o.filterOutFunc(ctx, interceptors.FullMethod(service, method)) { + return interceptors.NoopReporter{}, ctx + } + + newCtx, serverSpan := newServerSpanFromInbound(ctx, o.tracer, interceptors.FullMethod(service, method)) + mock := &opentracingServerReporter{ctx: newCtx, typ: typ, service: service, method: method, serverSpan: serverSpan} + return mock, newCtx +} + +// UnaryServerInterceptor returns a new unary server interceptor for OpenTracing. +func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor { + o := evaluateOptions(opts) + return interceptors.UnaryServerInterceptor(&opentracingServerReportable{tracer: o.tracer, traceHeaderName: o.traceHeaderName, filterOutFunc: o.filterOutFunc}) +} + +// StreamServerInterceptor returns a new streaming server interceptor for OpenTracing. +func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor { + o := evaluateOptions(opts) + return interceptors.StreamServerInterceptor(&opentracingServerReportable{tracer: o.tracer, traceHeaderName: o.traceHeaderName, filterOutFunc: o.filterOutFunc}) +} + +func newServerSpanFromInbound(ctx context.Context, tracer opentracing.Tracer, fullMethodName string) (context.Context, opentracing.Span) { + md := metautils.ExtractIncoming(ctx) + parentSpanContext, err := tracer.Extract(opentracing.HTTPHeaders, metadataTextMap(md)) + if err != nil && err != opentracing.ErrSpanContextNotFound { + grpclog.Infof("grpc_opentracing: failed parsing trace information: %v", err) + } + + serverSpan := tracer.StartSpan( + fullMethodName, + // this is magical, it attaches the new span to the parent parentSpanContext, and creates an unparented one if empty. + ext.RPCServerOption(parentSpanContext), + grpcTag, + ) + + return opentracing.ContextWithSpan(ctx, serverSpan), serverSpan +} diff --git a/pkg/tracing/util/metautils/doc.go b/pkg/tracing/util/metautils/doc.go new file mode 100644 index 0000000000..8905a81538 --- /dev/null +++ b/pkg/tracing/util/metautils/doc.go @@ -0,0 +1,24 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +/* +Package `metautils` provides convenience functions for dealing with gRPC metadata.MD objects inside +Context handlers. + +While the upstream grpc-go package contains decent functionality (see https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md) +they are hard to use. + +The majority of functions center around the NiceMD, which is a convenience wrapper around metadata.MD. For example +the following code allows you to easily extract incoming metadata (server handler) and put it into a new client context +metadata. + + nmd := metautils.ExtractIncoming(serverCtx).Clone(":authorization", ":custom") + clientCtx := nmd.Set("x-client-header", "2").Set("x-another", "3").ToOutgoing(ctx) +*/ + +package metautils diff --git a/pkg/tracing/util/metautils/nicemd.go b/pkg/tracing/util/metautils/nicemd.go new file mode 100644 index 0000000000..40c93e806d --- /dev/null +++ b/pkg/tracing/util/metautils/nicemd.go @@ -0,0 +1,131 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package metautils + +import ( + "context" + "strings" + + "google.golang.org/grpc/metadata" +) + +// NiceMD is a convenience wrapper defining extra functions on the metadata. +type NiceMD metadata.MD + +// ExtractIncoming extracts an inbound metadata from the server-side context. +// +// This function always returns a NiceMD wrapper of the metadata.MD, in case the context doesn't have metadata it returns +// a new empty NiceMD. +func ExtractIncoming(ctx context.Context) NiceMD { + md, ok := metadata.FromIncomingContext(ctx) + if !ok { + return NiceMD(metadata.Pairs()) + } + return NiceMD(md) +} + +// ExtractOutgoing extracts an outbound metadata from the client-side context. +// +// This function always returns a NiceMD wrapper of the metadata.MD, in case the context doesn't have metadata it returns +// a new empty NiceMD. +func ExtractOutgoing(ctx context.Context) NiceMD { + md, ok := metadata.FromOutgoingContext(ctx) + if !ok { + return NiceMD(metadata.Pairs()) + } + return NiceMD(md) +} + +// Clone performs a *deep* copy of the metadata.MD. +// +// You can specify the lower-case copiedKeys to only copy certain whitelisted keys. If no keys are explicitly whitelisted +// all keys get copied. +func (m NiceMD) Clone(copiedKeys ...string) NiceMD { + newMd := NiceMD(metadata.Pairs()) + for k, vv := range m { + found := false + if len(copiedKeys) == 0 { + found = true + } else { + for _, allowedKey := range copiedKeys { + if strings.EqualFold(allowedKey, k) { + found = true + break + } + } + } + if !found { + continue + } + newMd[k] = make([]string, len(vv)) + copy(newMd[k], vv) + } + return NiceMD(newMd) +} + +// ToOutgoing sets the given NiceMD as a client-side context for dispatching. +func (m NiceMD) ToOutgoing(ctx context.Context) context.Context { + return metadata.NewOutgoingContext(ctx, metadata.MD(m)) +} + +// ToIncoming sets the given NiceMD as a server-side context for dispatching. +// +// This is mostly useful in ServerInterceptors.. +func (m NiceMD) ToIncoming(ctx context.Context) context.Context { + return metadata.NewIncomingContext(ctx, metadata.MD(m)) +} + +// Get retrieves a single value from the metadata. +// +// It works analogously to http.Header.Get, returning the first value if there are many set. If the value is not set, +// an empty string is returned. +// +// The function is binary-key safe. +func (m NiceMD) Get(key string) string { + k, _ := encodeKeyValue(key, "") + vv, ok := m[k] + if !ok { + return "" + } + return vv[0] +} + +// Del retrieves a single value from the metadata. +// +// It works analogously to http.Header.Del, deleting all values if they exist. +// +// The function is binary-key safe. + +func (m NiceMD) Del(key string) NiceMD { + k, _ := encodeKeyValue(key, "") + delete(m, k) + return m +} + +// Set sets the given value in a metadata. +// +// It works analogously to http.Header.Set, overwriting all previous metadata values. +// +// The function is binary-key safe. +func (m NiceMD) Set(key string, value string) NiceMD { + k, v := encodeKeyValue(key, value) + m[k] = []string{v} + return m +} + +// Add retrieves a single value from the metadata. +// +// It works analogously to http.Header.Add, as it appends to any existing values associated with key. +// +// The function is binary-key safe. +func (m NiceMD) Add(key string, value string) NiceMD { + k, v := encodeKeyValue(key, value) + m[k] = append(m[k], v) + return m +} diff --git a/pkg/tracing/util/metautils/nicemd_test.go b/pkg/tracing/util/metautils/nicemd_test.go new file mode 100644 index 0000000000..15d0e48980 --- /dev/null +++ b/pkg/tracing/util/metautils/nicemd_test.go @@ -0,0 +1,96 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package metautils_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "google.golang.org/grpc/metadata" + + "github.com/thanos-io/thanos/pkg/tracing/util/metautils" +) + +type parentKey struct{} + +var key parentKey + +var ( + testPairs = []string{"singlekey", "uno", "multikey", "one", "multikey", "two", "multikey", "three"} + parentCtx = context.WithValue(context.TODO(), key, "parentValue") +) + +func assertRetainsParentContext(t *testing.T, ctx context.Context) { + x := ctx.Value(key) + assert.EqualValues(t, "parentValue", x, "context must contain parentCtx") +} + +func TestNiceMD_Get(t *testing.T) { + nmd := metautils.NiceMD(metadata.Pairs(testPairs...)) + assert.Equal(t, "uno", nmd.Get("singlekey"), "for present single-key value it should return it") + assert.Equal(t, "one", nmd.Get("multikey"), "for present multi-key should return first value") + assert.Empty(t, nmd.Get("nokey"), "for non existing key should return stuff") +} + +func TestNiceMD_Del(t *testing.T) { + nmd := metautils.NiceMD(metadata.Pairs(testPairs...)) + assert.Equal(t, "uno", nmd.Get("singlekey"), "for present single-key value it should return it") + nmd.Del("singlekey").Del("doesn't exist") + assert.Empty(t, nmd.Get("singlekey"), "after deletion singlekey shouldn't exist") +} + +func TestNiceMD_Add(t *testing.T) { + nmd := metautils.NiceMD(metadata.Pairs(testPairs...)) + nmd.Add("multikey", "four").Add("newkey", "something") + assert.EqualValues(t, []string{"one", "two", "three", "four"}, nmd["multikey"], "append should add a new four at the end") + assert.EqualValues(t, []string{"something"}, nmd["newkey"], "append should be able to create new keys") +} + +func TestNiceMD_Set(t *testing.T) { + nmd := metautils.NiceMD(metadata.Pairs(testPairs...)) + nmd.Set("multikey", "one").Set("newkey", "something").Set("newkey", "another") + assert.EqualValues(t, []string{"one"}, nmd["multikey"], "set should override existing multi keys") + assert.EqualValues(t, []string{"another"}, nmd["newkey"], "set should override new keys") +} + +func TestNiceMD_Clone(t *testing.T) { + nmd := metautils.NiceMD(metadata.Pairs(testPairs...)) + fullCopied := nmd.Clone() + assert.Equal(t, len(fullCopied), len(nmd), "clone full should copy all keys") + assert.Equal(t, "uno", fullCopied.Get("singlekey"), "full copied should have content") + subCopied := nmd.Clone("multikey") + assert.Len(t, subCopied, 1, "sub copied clone should only have one key") + assert.Empty(t, subCopied.Get("singlekey"), "there shouldn't be a singlekey in the subcopied") + + // Test side effects and full copying: + assert.EqualValues(t, subCopied["multikey"], nmd["multikey"], "before overwrites multikey should have the same values") + subCopied["multikey"][1] = "modifiedtwo" + assert.NotEqual(t, subCopied["multikey"], nmd["multikey"], "before overwrites multikey should have the same values") +} + +func TestNiceMD_ToOutgoing(t *testing.T) { + nmd := metautils.NiceMD(metadata.Pairs(testPairs...)) + nCtx := nmd.ToOutgoing(parentCtx) + assertRetainsParentContext(t, nCtx) + + eCtx := metautils.ExtractOutgoing(nCtx).Clone().Set("newvalue", "something").ToOutgoing(nCtx) + assertRetainsParentContext(t, eCtx) + assert.NotEqual(t, metautils.ExtractOutgoing(nCtx), metautils.ExtractOutgoing(eCtx), "the niceMD pointed to by ectx and nctx are different.") +} + +func TestNiceMD_ToIncoming(t *testing.T) { + nmd := metautils.NiceMD(metadata.Pairs(testPairs...)) + nCtx := nmd.ToIncoming(parentCtx) + assertRetainsParentContext(t, nCtx) + + eCtx := metautils.ExtractIncoming(nCtx).Clone().Set("newvalue", "something").ToIncoming(nCtx) + assertRetainsParentContext(t, eCtx) + assert.NotEqual(t, metautils.ExtractIncoming(nCtx), metautils.ExtractIncoming(eCtx), "the niceMD pointed to by ectx and nctx are different.") +} diff --git a/pkg/tracing/util/metautils/single_key.go b/pkg/tracing/util/metautils/single_key.go new file mode 100644 index 0000000000..8521d87646 --- /dev/null +++ b/pkg/tracing/util/metautils/single_key.go @@ -0,0 +1,26 @@ +// Copyright (c) The Thanos Authors. +// Licensed under the Apache License 2.0. + +/* +This was copied over from https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2.0.0-rc.3 +and modified to support tracing in Thanos till migration to Otel is supported. +*/ + +package metautils + +import ( + "encoding/base64" + "strings" +) + +const ( + binHdrSuffix = "-bin" +) + +func encodeKeyValue(k, v string) (string, string) { + k = strings.ToLower(k) + if strings.HasSuffix(k, binHdrSuffix) { + return k, base64.StdEncoding.EncodeToString([]byte(v)) + } + return k, v +} diff --git a/pkg/ui/react-app/package-lock.json b/pkg/ui/react-app/package-lock.json index f1f1e0c172..4f3bea4e9e 100644 --- a/pkg/ui/react-app/package-lock.json +++ b/pkg/ui/react-app/package-lock.json @@ -3606,29 +3606,62 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.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.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "devOptional": true, "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "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.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "devOptional": 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.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "devOptional": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@lezer/common": { @@ -4386,9 +4419,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/express": { @@ -4999,148 +5032,148 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -6103,10 +6136,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -6117,26 +6151,35 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bser": { @@ -6244,14 +6287,24 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001316", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz", - "integrity": "sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==", + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", "devOptional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", @@ -7642,9 +7695,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz", - "integrity": "sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==", + "version": "1.4.762", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.762.tgz", + "integrity": "sha512-rrFvGweLxPwwSwJOjIopy3Vr+J3cIPtZzuc74bmlvmBIgQO3VYJDvVrlj94iKZ3ukXUH64Ex31hSfRTLqvjYJQ==", "devOptional": true }, "node_modules/emittery": { @@ -7683,9 +7736,9 @@ } }, "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.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7889,9 +7942,9 @@ "dev": true }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", "dev": true }, "node_modules/es-to-primitive": { @@ -7911,8 +7964,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "devOptional": true, "engines": { "node": ">=6" @@ -9055,8 +9109,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9403,9 +9458,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "node_modules/fs.realpath": { @@ -9631,9 +9686,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.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/gud": { @@ -10144,9 +10199,9 @@ } }, "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", "dev": true }, "node_modules/ipaddr.js": { @@ -10319,6 +10374,7 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" @@ -13849,12 +13905,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", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", @@ -14183,12 +14233,12 @@ } }, "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.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -14575,9 +14625,9 @@ "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.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "devOptional": true }, "node_modules/normalize-path": { @@ -17912,9 +17962,9 @@ } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -18007,9 +18057,9 @@ "dev": true }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -18975,14 +19025,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.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dev": true, "dependencies": { - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -18993,16 +19043,16 @@ } }, "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.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -19026,19 +19076,10 @@ } } }, - "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/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.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -19053,15 +19094,6 @@ "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", @@ -19123,6 +19155,7 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" @@ -19405,6 +19438,36 @@ "yarn": "*" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", @@ -19554,9 +19617,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.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -19583,34 +19646,34 @@ } }, "node_modules/webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -19630,13 +19693,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.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "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" @@ -19906,9 +19969,9 @@ } }, "node_modules/webpack/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.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -19918,9 +19981,9 @@ } }, "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -23059,26 +23122,53 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@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.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "devOptional": true }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "@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.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "devOptional": 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.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "devOptional": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@lezer/common": { @@ -23600,9 +23690,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/express": { @@ -24092,148 +24182,148 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -24980,10 +25070,11 @@ } }, "braces": { - "version": "3.0.2", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-process-hrtime": { @@ -24991,16 +25082,15 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.0.tgz", - "integrity": "sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "devOptional": true, "requires": { - "caniuse-lite": "^1.0.30001313", - "electron-to-chromium": "^1.4.76", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" } }, "bser": { @@ -25084,9 +25174,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001316", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001316.tgz", - "integrity": "sha512-JgUdNoZKxPZFzbzJwy4hDSyGuH/gXz2rN51QmoR8cBQsVo58llD3A0vlRKKRt8FGf5u69P9eQyIH8/z9vN/S0Q==", + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", "devOptional": true }, "case-sensitive-paths-webpack-plugin": { @@ -26129,9 +26219,9 @@ } }, "electron-to-chromium": { - "version": "1.4.82", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.82.tgz", - "integrity": "sha512-Ks+ANzLoIrFDUOJdjxYMH6CMKB8UQo5modAwvSZTxgF+vEs/U7G5IbWFUp6dS4klPkTDVdxbORuk8xAXXhMsWw==", + "version": "1.4.762", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.762.tgz", + "integrity": "sha512-rrFvGweLxPwwSwJOjIopy3Vr+J3cIPtZzuc74bmlvmBIgQO3VYJDvVrlj94iKZ3ukXUH64Ex31hSfRTLqvjYJQ==", "devOptional": true }, "emittery": { @@ -26158,9 +26248,9 @@ "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.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -26326,9 +26416,9 @@ "dev": true }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", "dev": true }, "es-to-primitive": { @@ -26342,8 +26432,9 @@ } }, "escalade": { - "version": "3.1.1", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "devOptional": true }, "escape-html": { @@ -27181,8 +27272,9 @@ "dev": true }, "fill-range": { - "version": "7.0.1", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } @@ -27421,9 +27513,9 @@ } }, "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "fs.realpath": { @@ -27584,9 +27676,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.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "gud": { @@ -27971,9 +28063,9 @@ } }, "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", "dev": true }, "ipaddr.js": { @@ -28083,6 +28175,7 @@ }, "is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { @@ -30743,12 +30836,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "devOptional": 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", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", @@ -31020,12 +31107,12 @@ "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.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.4" } }, "memoize-one": { @@ -31319,9 +31406,9 @@ "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.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "devOptional": true }, "normalize-path": { @@ -33647,9 +33734,9 @@ } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -33727,9 +33814,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -34474,21 +34561,21 @@ } }, "terser": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", - "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dev": true, "requires": { - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { "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.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "commander": { @@ -34496,34 +34583,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.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.20", "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 - } + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" } }, "test-exclude": { @@ -34578,6 +34651,7 @@ }, "to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" @@ -34789,6 +34863,16 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, + "update-browserslist-db": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "devOptional": true, + "requires": { + "escalade": "^3.1.2", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", @@ -34915,9 +34999,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.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -34938,60 +35022,60 @@ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" }, "webpack": { - "version": "5.70.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", - "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.2", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-better-errors": "^1.0.2", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { "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.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "requires": {} } } }, "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.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "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" diff --git a/pkg/ui/react-app/src/pages/graph/Graph.tsx b/pkg/ui/react-app/src/pages/graph/Graph.tsx index e63deb3b10..a58ff44626 100644 --- a/pkg/ui/react-app/src/pages/graph/Graph.tsx +++ b/pkg/ui/react-app/src/pages/graph/Graph.tsx @@ -11,6 +11,7 @@ require('../../vendor/flot/jquery.flot'); require('../../vendor/flot/jquery.flot.stack'); require('../../vendor/flot/jquery.flot.time'); require('../../vendor/flot/jquery.flot.crosshair'); +require('../../vendor/flot/jquery.flot.selection'); require('jquery.flot.tooltip'); export interface GraphProps { @@ -20,6 +21,7 @@ export interface GraphProps { }; stacked: boolean; useLocalTime: boolean; + handleTimeRangeSelection: (startTime: number, endTime: number) => void; queryParams: QueryParams | null; } @@ -66,6 +68,15 @@ class Graph extends PureComponent { componentDidMount(): void { this.plot(); + + $(`.graph-chart`).bind('plotselected', (_, ranges) => { + if (isPresent(this.$chart)) { + // eslint-disable-next-line + // @ts-ignore Typescript doesn't think this method exists although it actually does. + this.$chart.clearSelection(); + this.props.handleTimeRangeSelection(ranges.xaxis.from, ranges.xaxis.to); + } + }); } componentWillUnmount(): void { diff --git a/pkg/ui/react-app/src/pages/graph/GraphHelpers.test.ts b/pkg/ui/react-app/src/pages/graph/GraphHelpers.test.ts index c8dca0b322..0ead4c5939 100644 --- a/pkg/ui/react-app/src/pages/graph/GraphHelpers.test.ts +++ b/pkg/ui/react-app/src/pages/graph/GraphHelpers.test.ts @@ -185,6 +185,9 @@ describe('GraphHelpers', () => { lines: { lineWidth: 1, steps: false, fill: true }, shadowSize: 0, }, + selection: { + mode: 'x', + }, }); }); }); diff --git a/pkg/ui/react-app/src/pages/graph/GraphHelpers.ts b/pkg/ui/react-app/src/pages/graph/GraphHelpers.ts index c13f1f6246..a995c154cd 100644 --- a/pkg/ui/react-app/src/pages/graph/GraphHelpers.ts +++ b/pkg/ui/react-app/src/pages/graph/GraphHelpers.ts @@ -133,6 +133,9 @@ export const getOptions = (stacked: boolean, useLocalTime: boolean): jquery.flot }, shadowSize: 0, }, + selection: { + mode: 'x', + }, }; }; diff --git a/pkg/ui/react-app/src/pages/graph/GraphTabContent.tsx b/pkg/ui/react-app/src/pages/graph/GraphTabContent.tsx index 826e96341a..9fc754e063 100644 --- a/pkg/ui/react-app/src/pages/graph/GraphTabContent.tsx +++ b/pkg/ui/react-app/src/pages/graph/GraphTabContent.tsx @@ -8,10 +8,17 @@ interface GraphTabContentProps { data: any; stacked: boolean; useLocalTime: boolean; + handleTimeRangeSelection: (startTime: number, endTime: number) => void; lastQueryParams: QueryParams | null; } -export const GraphTabContent: FC = ({ data, stacked, useLocalTime, lastQueryParams }) => { +export const GraphTabContent: FC = ({ + data, + stacked, + useLocalTime, + lastQueryParams, + handleTimeRangeSelection, +}) => { if (!isPresent(data)) { return No data queried yet; } @@ -25,5 +32,13 @@ export const GraphTabContent: FC = ({ data, stacked, useLo ); } - return ; + return ( + + ); }; diff --git a/pkg/ui/react-app/src/pages/graph/Panel.tsx b/pkg/ui/react-app/src/pages/graph/Panel.tsx index 4355a8f1ed..3f755637b7 100644 --- a/pkg/ui/react-app/src/pages/graph/Panel.tsx +++ b/pkg/ui/react-app/src/pages/graph/Panel.tsx @@ -247,7 +247,7 @@ class Panel extends Component { // Create request headers const requestHeaders: HeadersInit = new Headers(); - requestHeaders.set('Content-Type', 'application/json'); + requestHeaders.set('Content-Type', 'application/x-www-form-urlencoded'); if (this.props.options.forceTracing) { requestHeaders.set('X-Thanos-Force-Tracing', 'true'); @@ -257,9 +257,10 @@ class Panel extends Component { requestHeaders.set(tenantHeader, this.props.options.tenant); } - fetch(`${this.props.pathPrefix}${path}?${params}`, { - method: 'GET', + fetch(`${this.props.pathPrefix}${path}`, { + method: 'POST', headers: requestHeaders, + body: params, cache: 'no-store', credentials: 'same-origin', signal: abortController.signal, @@ -424,6 +425,10 @@ class Panel extends Component { } }; + handleTimeRangeSelection = (startTime: number, endTime: number) => { + this.setOptions({ range: endTime - startTime, endTime: endTime }); + }; + getExplainOutput = (): void => { //We need to pass the same parameters as query endpoints, to the explain endpoints. const endTime = this.getEndTime().valueOf() / 1000; @@ -741,6 +746,7 @@ class Panel extends Component { data={this.state.data} stacked={options.stacked} useLocalTime={this.props.useLocalTime} + handleTimeRangeSelection={this.handleTimeRangeSelection} lastQueryParams={this.state.lastQueryParams} /> diff --git a/pkg/ui/react-app/src/pages/graph/TimeInput.tsx b/pkg/ui/react-app/src/pages/graph/TimeInput.tsx index d938280589..cd4fdb2c1a 100644 --- a/pkg/ui/react-app/src/pages/graph/TimeInput.tsx +++ b/pkg/ui/react-app/src/pages/graph/TimeInput.tsx @@ -78,8 +78,11 @@ class TimeInput extends Component { defaultDate: this.props.time, }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any this.$time.on('change.datetimepicker', (e: any) => { - if (e.date) { + // The end time can also be set by dragging a section on the graph, + // and that value will have decimal places. + if (e.date && e.date.valueOf() !== Math.trunc(this.props.time?.valueOf() ?? 0)) { this.props.onChangeTime(e.date.valueOf()); } }); diff --git a/pkg/ui/react-app/src/thanos/pages/blocks/helpers.test.tsx b/pkg/ui/react-app/src/thanos/pages/blocks/helpers.test.tsx index 646829d317..21f09bfc01 100644 --- a/pkg/ui/react-app/src/thanos/pages/blocks/helpers.test.tsx +++ b/pkg/ui/react-app/src/thanos/pages/blocks/helpers.test.tsx @@ -531,6 +531,9 @@ const blockPools = { ], ], }, + '5': { + '1-0': [], + }, }; // Total filtered blocks = 1 @@ -634,8 +637,8 @@ describe('isOverlapping helper', () => { }); describe('Block Pools', () => { - it('should have exactly 4 objects', () => { - expect(Object.keys(blockPools)).toHaveLength(4); + it('should have exactly 5 objects', () => { + expect(Object.keys(blockPools)).toHaveLength(5); }); }); diff --git a/pkg/ui/react-app/src/thanos/pages/blocks/helpers.ts b/pkg/ui/react-app/src/thanos/pages/blocks/helpers.ts index 76253e4e96..24c554c7ff 100644 --- a/pkg/ui/react-app/src/thanos/pages/blocks/helpers.ts +++ b/pkg/ui/react-app/src/thanos/pages/blocks/helpers.ts @@ -156,7 +156,11 @@ export const getFilteredBlockPools = ( const poolArrayIndex = blockPools[key]; const poolArray = poolArrayIndex[Object.keys(poolArrayIndex)[0]]; for (let i = 0; i < filteredBlocks.length; i++) { - if (JSON.stringify(filteredBlocks[i].thanos.labels) === JSON.stringify(poolArray[0][0].thanos.labels)) { + if ( + poolArray[0] && + poolArray[0][0] && + JSON.stringify(filteredBlocks[i].thanos.labels) === JSON.stringify(poolArray[0][0].thanos.labels) + ) { Object.assign(newblockPools, { [key]: blockPools[key] }); break; } diff --git a/pkg/ui/react-app/src/types/index.d.ts b/pkg/ui/react-app/src/types/index.d.ts index a659b67b46..7033555b24 100644 --- a/pkg/ui/react-app/src/types/index.d.ts +++ b/pkg/ui/react-app/src/types/index.d.ts @@ -41,6 +41,9 @@ declare namespace jquery.flot { series: { [K in keyof jquery.flot.seriesOptions]: jq.flot.seriesOptions[K] } & { stack: boolean; }; + selection: { + mode: string; + }; } } diff --git a/pkg/ui/react-app/src/utils/index.ts b/pkg/ui/react-app/src/utils/index.ts index 50b6cca5d0..7cbd8ce8ea 100644 --- a/pkg/ui/react-app/src/utils/index.ts +++ b/pkg/ui/react-app/src/utils/index.ts @@ -287,7 +287,8 @@ export const encodePanelOptionsToQueryString = (panels: PanelMeta[]): string => }; export const createExpressionLink = (expr: string): string => { - return `../graph?g0.expr=${encodeURIComponent(expr)}&g0.tab=1&g0.stacked=0&g0.range_input=1h`; + const alertSourceTemplate = '/graph?g0.expr={{.Expr}}&g0.tab=1'; + return `${alertSourceTemplate.replace('{{.Expr}}', encodeURIComponent(expr))}&g0.stacked=0&g0.range_input=1h`; }; export const createExternalExpressionLink = (expr: string): string => { diff --git a/pkg/ui/react-app/src/vendor/flot/jquery.flot.selection.js b/pkg/ui/react-app/src/vendor/flot/jquery.flot.selection.js new file mode 100644 index 0000000000..30970da332 --- /dev/null +++ b/pkg/ui/react-app/src/vendor/flot/jquery.flot.selection.js @@ -0,0 +1,413 @@ +/** + * + * THIS FILE WAS COPIED INTO THANOS FROM GRAFANA'S VENDORED FORK OF FLOT + * (LIVING AT https://github.com/grafana/grafana/tree/v7.5.8/public/vendor/flot). + * THE ORIGINAL FLOT CODE WAS LICENSED UNDER THE MIT LICENSE AS STATED BELOW. + * ADDITIONAL CHANGES HAVE BEEN CONTRIBUTED TO THE GRAFANA FORK UNDER AN + * APACHE 2 LICENSE, SEE https://github.com/grafana/grafana/blob/v7.5.8/LICENSE. + */ + +/* eslint-disable prefer-spread */ +/* eslint-disable no-loop-func */ +/* eslint-disable @typescript-eslint/no-this-alias */ +/* eslint-disable no-redeclare */ +/* eslint-disable no-useless-escape */ +/* eslint-disable prefer-const */ +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +/* eslint-disable @typescript-eslint/no-use-before-define */ +/* eslint-disable eqeqeq */ +/* eslint-disable no-var */ +/* Flot plugin for selecting regions of a plot. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + +selection: { + mode: null or "x" or "y" or "xy", + color: color, + shape: "round" or "miter" or "bevel", + minSize: number of pixels +} + +Selection support is enabled by setting the mode to one of "x", "y" or "xy". +In "x" mode, the user will only be able to specify the x range, similarly for +"y" mode. For "xy", the selection becomes a rectangle where both ranges can be +specified. "color" is color of the selection (if you need to change the color +later on, you can get to it with plot.getOptions().selection.color). "shape" +is the shape of the corners of the selection. + +"minSize" is the minimum size a selection can be in pixels. This value can +be customized to determine the smallest size a selection can be and still +have the selection rectangle be displayed. When customizing this value, the +fact that it refers to pixels, not axis units must be taken into account. +Thus, for example, if there is a bar graph in time mode with BarWidth set to 1 +minute, setting "minSize" to 1 will not make the minimum selection size 1 +minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent +"plotunselected" events from being fired when the user clicks the mouse without +dragging. + +When selection support is enabled, a "plotselected" event will be emitted on +the DOM element you passed into the plot function. The event handler gets a +parameter with the ranges selected on the axes, like this: + + placeholder.bind( "plotselected", function( event, ranges ) { + alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to) + // similar for yaxis - with multiple axes, the extra ones are in + // x2axis, x3axis, ... + }); + +The "plotselected" event is only fired when the user has finished making the +selection. A "plotselecting" event is fired during the process with the same +parameters as the "plotselected" event, in case you want to know what's +happening while it's happening, + +A "plotunselected" event with no arguments is emitted when the user clicks the +mouse to remove the selection. As stated above, setting "minSize" to 0 will +destroy this behavior. + +The plugin allso adds the following methods to the plot object: + +- setSelection( ranges, preventEvent ) + + Set the selection rectangle. The passed in ranges is on the same form as + returned in the "plotselected" event. If the selection mode is "x", you + should put in either an xaxis range, if the mode is "y" you need to put in + an yaxis range and both xaxis and yaxis if the selection mode is "xy", like + this: + + setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } }); + + setSelection will trigger the "plotselected" event when called. If you don't + want that to happen, e.g. if you're inside a "plotselected" handler, pass + true as the second parameter. If you are using multiple axes, you can + specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of + xaxis, the plugin picks the first one it sees. + +- clearSelection( preventEvent ) + + Clear the selection rectangle. Pass in true to avoid getting a + "plotunselected" event. + +- getSelection() + + Returns the current selection in the same format as the "plotselected" + event. If there's currently no selection, the function returns null. + +*/ + +(function($) { + function init(plot) { + var selection = { + first: { x: -1, y: -1 }, + second: { x: -1, y: -1 }, + show: false, + active: false, + }; + + // FIXME: The drag handling implemented here should be + // abstracted out, there's some similar code from a library in + // the navigation plugin, this should be massaged a bit to fit + // the Flot cases here better and reused. Doing this would + // make this plugin much slimmer. + var savedhandlers = {}; + + var mouseUpHandler = null; + + function onMouseMove(e) { + if (selection.active) { + updateSelection(e); + + plot.getPlaceholder().trigger('plotselecting', [getSelection()]); + } + } + + function onMouseDown(e) { + if (e.which != 1) + // only accept left-click + return; + + // cancel out any text selections + document.body.focus(); + + // prevent text selection and drag in old-school browsers + if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) { + savedhandlers.onselectstart = document.onselectstart; + document.onselectstart = function() { + return false; + }; + } + if (document.ondrag !== undefined && savedhandlers.ondrag == null) { + savedhandlers.ondrag = document.ondrag; + document.ondrag = function() { + return false; + }; + } + + setSelectionPos(selection.first, e); + + selection.active = true; + + // this is a bit silly, but we have to use a closure to be + // able to whack the same handler again + mouseUpHandler = function(e) { + onMouseUp(e); + }; + + $(document).one('mouseup', mouseUpHandler); + } + + function onMouseUp(e) { + mouseUpHandler = null; + + // revert drag stuff for old-school browsers + if (document.onselectstart !== undefined) document.onselectstart = savedhandlers.onselectstart; + if (document.ondrag !== undefined) document.ondrag = savedhandlers.ondrag; + + // no more dragging + selection.active = false; + updateSelection(e); + + if (selectionIsSane()) triggerSelectedEvent(e); + else { + // this counts as a clear + plot.getPlaceholder().trigger('plotunselected', []); + plot.getPlaceholder().trigger('plotselecting', [null]); + } + + setTimeout(function() { + plot.isSelecting = false; + }, 10); + + return false; + } + + function getSelection() { + if (!selectionIsSane()) return null; + + if (!selection.show) return null; + + var r = {}, + c1 = selection.first, + c2 = selection.second; + var axes = plot.getAxes(); + // look if no axis is used + var noAxisInUse = true; + $.each(axes, function(name, axis) { + if (axis.used) { + //anyUsed = false; + } + }); + + $.each(axes, function(name, axis) { + if (axis.used || noAxisInUse) { + var p1 = axis.c2p(c1[axis.direction]), + p2 = axis.c2p(c2[axis.direction]); + r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) }; + } + }); + return r; + } + + function triggerSelectedEvent(event) { + var r = getSelection(); + + // Add ctrlKey and metaKey to event + r.ctrlKey = event.ctrlKey; + r.metaKey = event.metaKey; + + plot.getPlaceholder().trigger('plotselected', [r]); + + // backwards-compat stuff, to be removed in future + if (r.xaxis && r.yaxis) + plot.getPlaceholder().trigger('selected', [{ x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to }]); + } + + function clamp(min, value, max) { + return value < min ? min : value > max ? max : value; + } + + function setSelectionPos(pos, e) { + var o = plot.getOptions(); + var offset = plot.getPlaceholder().offset(); + var plotOffset = plot.getPlotOffset(); + pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width()); + pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height()); + + if (o.selection.mode == 'y') pos.x = pos == selection.first ? 0 : plot.width(); + + if (o.selection.mode == 'x') pos.y = pos == selection.first ? 0 : plot.height(); + } + + function updateSelection(pos) { + if (pos.pageX == null) return; + + setSelectionPos(selection.second, pos); + if (selectionIsSane()) { + plot.isSelecting = true; + selection.show = true; + plot.triggerRedrawOverlay(); + } else clearSelection(true); + } + + function clearSelection(preventEvent) { + if (selection.show) { + selection.show = false; + plot.triggerRedrawOverlay(); + if (!preventEvent) plot.getPlaceholder().trigger('plotunselected', []); + } + } + + // function taken from markings support in Flot + function extractRange(ranges, coord) { + var axis, + from, + to, + key, + axes = plot.getAxes(); + + for (var k in axes) { + axis = axes[k]; + if (axis.direction == coord) { + key = coord + axis.n + 'axis'; + if (!ranges[key] && axis.n == 1) key = coord + 'axis'; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == 'x' ? plot.getXAxes()[0] : plot.getYAxes()[0]; + from = ranges[coord + '1']; + to = ranges[coord + '2']; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function setSelection(ranges, preventEvent) { + var range, + o = plot.getOptions(); + + if (o.selection.mode == 'y') { + selection.first.x = 0; + selection.second.x = plot.width(); + } else { + range = extractRange(ranges, 'x'); + + selection.first.x = range.axis.p2c(range.from); + selection.second.x = range.axis.p2c(range.to); + } + + if (o.selection.mode == 'x') { + selection.first.y = 0; + selection.second.y = plot.height(); + } else { + range = extractRange(ranges, 'y'); + + selection.first.y = range.axis.p2c(range.from); + selection.second.y = range.axis.p2c(range.to); + } + + selection.show = true; + plot.triggerRedrawOverlay(); + if (!preventEvent && selectionIsSane()) triggerSelectedEvent(); + } + + function selectionIsSane() { + var minSize = plot.getOptions().selection.minSize; + return ( + Math.abs(selection.second.x - selection.first.x) >= minSize && + Math.abs(selection.second.y - selection.first.y) >= minSize + ); + } + + plot.clearSelection = clearSelection; + plot.setSelection = setSelection; + plot.getSelection = getSelection; + + plot.hooks.bindEvents.push(function(plot, eventHolder) { + var o = plot.getOptions(); + if (o.selection.mode != null) { + eventHolder.mousemove(onMouseMove); + eventHolder.mousedown(onMouseDown); + } + }); + + plot.hooks.drawOverlay.push(function(plot, ctx) { + // draw selection + if (selection.show && selectionIsSane()) { + var plotOffset = plot.getPlotOffset(); + var o = plot.getOptions(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var c = $.color.parse(o.selection.color); + + ctx.strokeStyle = c.scale('a', 0.8).toString(); + ctx.lineWidth = 1; + ctx.lineJoin = o.selection.shape; + ctx.fillStyle = c.scale('a', 0.4).toString(); + + var x = Math.min(selection.first.x, selection.second.x) + 0.5, + y = Math.min(selection.first.y, selection.second.y) + 0.5, + w = Math.abs(selection.second.x - selection.first.x) - 1, + h = Math.abs(selection.second.y - selection.first.y) - 1; + + ctx.fillRect(x, y, w, h); + ctx.strokeRect(x, y, w, h); + + ctx.restore(); + } + }); + + plot.hooks.shutdown.push(function(plot, eventHolder) { + eventHolder.unbind('mousemove', onMouseMove); + eventHolder.unbind('mousedown', onMouseDown); + + if (mouseUpHandler) { + $(document).unbind('mouseup', mouseUpHandler); + // grafana addition + // In L114 this plugin is overrinding document.onselectstart handler to prevent default or custom behaviour + // Then this patch is being restored during mouseup event. But, mouseup handler is unbound when this plugin is destroyed + // and the overridden onselectstart handler is not restored. The problematic behaviour surfaces when flot is re-rendered + // as a consequence of panel's model update. When i.e. options are applied via onBlur + // event on some input which results in flot re-render. The mouseup handler should be called to resture the original handlers + // but by the time the document mouseup event occurs, the event handler is no longer there, so onselectstart is permanently overridden. + // To fix that we are making sure that the overrides are reverted when this plugin is destroyed, the same way as they would + // via mouseup event handler (L138) + + if (document.onselectstart !== undefined) document.onselectstart = savedhandlers.onselectstart; + if (document.ondrag !== undefined) document.ondrag = savedhandlers.ondrag; + } + }); + } + + $.plot.plugins.push({ + init: init, + options: { + selection: { + mode: null, // one of null, "x", "y" or "xy" + color: '#e8cfac', + shape: 'round', // one of "round", "miter", or "bevel" + minSize: 5, // minimum number of pixels + }, + }, + name: 'selection', + version: '1.1', + }); + })(window.jQuery); + \ No newline at end of file diff --git a/pkg/ui/static/react/asset-manifest.json b/pkg/ui/static/react/asset-manifest.json index 838abcc58a..eab390bb56 100644 --- a/pkg/ui/static/react/asset-manifest.json +++ b/pkg/ui/static/react/asset-manifest.json @@ -1,15 +1,15 @@ { "files": { - "main.css": "./static/css/main.5a4981c4.css", - "main.js": "./static/js/main.0792ff52.js", + "main.css": "./static/css/main.17d667f4.css", + "main.js": "./static/js/main.77f2d0fe.js", "static/media/codicon.ttf": "./static/media/codicon.b3726f0165bf67ac6849.ttf", "index.html": "./index.html", "static/media/index.cjs": "./static/media/index.cd351d7c31d0d3fccf96.cjs", - "main.5a4981c4.css.map": "./static/css/main.5a4981c4.css.map", - "main.0792ff52.js.map": "./static/js/main.0792ff52.js.map" + "main.17d667f4.css.map": "./static/css/main.17d667f4.css.map", + "main.77f2d0fe.js.map": "./static/js/main.77f2d0fe.js.map" }, "entrypoints": [ - "static/css/main.5a4981c4.css", - "static/js/main.0792ff52.js" + "static/css/main.17d667f4.css", + "static/js/main.77f2d0fe.js" ] } \ No newline at end of file diff --git a/pkg/ui/static/react/index.html b/pkg/ui/static/react/index.html index 976977ee2e..dc37a0ba59 100644 --- a/pkg/ui/static/react/index.html +++ b/pkg/ui/static/react/index.html @@ -1 +1 @@ -Thanos | Highly available Prometheus setup
\ No newline at end of file +Thanos | Highly available Prometheus setup
\ No newline at end of file diff --git a/pkg/ui/static/react/static/css/main.17d667f4.css b/pkg/ui/static/react/static/css/main.17d667f4.css new file mode 100644 index 0000000000..0fb47bee91 --- /dev/null +++ b/pkg/ui/static/react/static/css/main.17d667f4.css @@ -0,0 +1,6 @@ +/*!@preserve + * Tempus Dominus Bootstrap4 v5.39.0 (https://tempusdominus.github.io/bootstrap-4/) + * Copyright 2016-2020 Jonathan Peterson and contributors + * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE) + */.bootstrap-datetimepicker-widget .btn[data-action=clear]:after,.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]:after,.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]:after,.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]:after,.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]:after,.bootstrap-datetimepicker-widget .btn[data-action=showHours]:after,.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]:after,.bootstrap-datetimepicker-widget .btn[data-action=today]:after,.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]:after,.bootstrap-datetimepicker-widget .picker-switch:after,.bootstrap-datetimepicker-widget table th.next:after,.bootstrap-datetimepicker-widget table th.prev:after,.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}body.tempusdominus-bootstrap-datetimepicker-widget-day-click,body.tempusdominus-bootstrap-datetimepicker-widget-day-click *{cursor:pointer!important}body.tempusdominus-bootstrap-datetimepicker-widget-day-click{position:relative!important}.tempusdominus-bootstrap-datetimepicker-widget-day-click-glass-panel{bottom:0;cursor:pointer!important;left:0;position:absolute;right:0;top:0;z-index:999999999999}.bootstrap-datetimepicker-widget .datepicker-days tbody td{cursor:pointer}.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{display:block;margin:2px 0;padding:4px;width:14rem}.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks,.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons{width:16rem}.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons{width:17rem}@media (min-width:576px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:after,.bootstrap-datetimepicker-widget.dropdown-menu:before{content:"";display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-bottom:7px solid #0003;border-left:7px solid #0000;border-right:7px solid #0000;left:7px;top:-7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-bottom:6px solid #fff;border-left:6px solid #0000;border-right:6px solid #0000;left:8px;top:-6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid #0000;border-right:7px solid #0000;border-top:7px solid #0003;bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid #0000;border-right:6px solid #0000;border-top:6px solid #fff;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.float-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.float-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget.dropdown-menu.wider{width:16rem}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{font-size:1.2em;font-weight:700;margin:0;width:54px}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]{font-family:Arial,sans-serif,-apple-system,system-ui,Segoe UI,Roboto,Helvetica Neue,Noto Sans,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;height:38px;text-align:center;width:38px}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]:after{content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]:after{content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]:after{content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]:after{content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=showHours]:after{content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]:after{content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]:after{content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action=clear]:after{content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action=today]:after{content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch:after{content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{height:auto;line-height:inherit;margin:0;padding:0;width:auto}.bootstrap-datetimepicker-widget .picker-switch td span{height:2.5em;line-height:2.5;width:100%}.bootstrap-datetimepicker-widget .picker-switch.picker-switch-with-feathers-icons td span{height:2.8em;line-height:2.8}.bootstrap-datetimepicker-widget table{margin:0;width:100%}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{border-radius:.25rem;text-align:center}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev:after{content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next:after{content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e9ecef}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{color:#6c757d;cursor:default;font-size:.8em;height:20px;line-height:20px}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#e9ecef;cursor:pointer}.bootstrap-datetimepicker-widget table td.new,.bootstrap-datetimepicker-widget table td.old{color:#6c757d}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{border-color:#0003 #0000 #007bff;border-style:solid;border-width:0 0 7px 7px;bottom:4px;content:"";display:inline-block;position:absolute;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#007bff;color:#fff;text-shadow:0 -1px 0 #00000040}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{border-radius:.25rem;cursor:pointer;display:inline-block;height:54px;line-height:54px;margin-bottom:2px;margin-top:2px;width:54px}.bootstrap-datetimepicker-widget table td span:hover{background:#e9ecef}.bootstrap-datetimepicker-widget table td span.active{background-color:#007bff;color:#fff;text-shadow:0 -1px 0 #00000040}.bootstrap-datetimepicker-widget table td span.old{color:#6c757d}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn{color:#007bff;color:var(--blue,#007bff)}.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn:hover{color:#0056b3}.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second{cursor:default;pointer-events:none}.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second:hover{background:0 0}.input-group [data-toggle=datetimepicker]{cursor:pointer}.ScrapePoolPanel_container__mwUUe{margin-top:-12px}.ScrapePoolPanel_title__SgTOh{cursor:pointer;font-size:20px;font-weight:700}.ScrapePoolPanel_danger__4lB8E{color:#f24141}.ScrapePoolPanel_table__fR2-c{width:100%}.ScrapePoolPanel_cell__7hR2J{word-wrap:break-word;height:auto;word-break:break-all}.ScrapePoolPanel_endpoint__FMY2G,.ScrapePoolPanel_labels__iJ\+7v{width:25%}.ScrapePoolPanel_last-scrape__Fu0ek,.ScrapePoolPanel_state__AncRn{width:10%}.ScrapePoolPanel_errors__etLp1{width:30%}.TargetLabels_discovered__H1zfq{white-space:nowrap}.NotFound_container__qQ5PC{height:85vh;width:100%}.ErrorBoundary_container__q5-zp,.NotFound_container__qQ5PC{align-items:center;display:flex;flex-direction:column;justify-content:center}.ErrorBoundary_container__q5-zp{min-height:100vh}button.ErrorBoundary_detailsBtn__iTaIc{font-size:1.2em;margin:2em 0}.ErrorBoundary_errorDiv__CKpY3{font-family:monospace;white-space:pre-wrap}.blocks_container__VvRYV{--top:72px;display:flex;min-height:calc(100vh - var(--top));position:relative;z-index:1}.blocks_grid__ZazGZ{width:100%}.blocks_sources__rl8vd{max-height:calc(100vh - var(--top)*2);overflow-y:auto;scrollbar-color:#b1b1b1 #0000;scrollbar-width:thin}.blocks_sources__rl8vd::-webkit-scrollbar{width:8px}.blocks_sources__rl8vd::-webkit-scrollbar-thumb{background-color:#b1b1b1;border-radius:6px}.blocks_blockDetails__ytMWm{box-sizing:border-box;margin-right:-15px;margin-top:-16px;max-width:55vw;min-width:0;overflow-x:hidden;overflow-y:auto;transition:all .2s ease-in-out;width:0}.blocks_blockDetails__ytMWm.blocks_open__DNi1D{box-shadow:0 10px 20px #00000030,0 6px 6px #0000003b;min-width:420px;padding:2em}.blocks_detailsTop__XTw42{align-items:center;display:flex;flex-wrap:wrap-reverse;justify-content:space-between;width:100%}.blocks_header__rBZkV{font-size:1.1em;font-weight:700;margin:0;padding:0}.blocks_closeBtn__xObeQ{background:none;border:none;font-size:2em;transform:translateY(-10%)}.blocks_timeRangeDiv__0Lht-{align-items:center;box-sizing:border-box;display:flex;flex-direction:column;height:var(--top);justify-content:space-evenly;padding:0 3em}.blocks_timeRange__2JnqI{font-size:.9em;justify-content:space-between}.blocks_source__5eSF5,.blocks_timeRange__2JnqI{align-items:center;display:flex;width:100%}.blocks_title__tLgxv{box-sizing:border-box;padding:0 1em}.blocks_title__tLgxv>span{box-sizing:border-box;display:block;margin:0;overflow:hidden;text-align:center;text-overflow:ellipsis;width:8vw}.blocks_rowsContainer__WJLAk{border-left:3px solid teal;box-sizing:border-box;display:flex;flex-direction:column;width:100%}.blocks_row__XXEWv{--block-height:1.2em;box-sizing:initial;height:var(--block-height);margin:.1em 0;overflow-x:hidden;position:relative;width:100%}.blocks_blockSpan__-rVfz{border:none;box-sizing:border-box;height:100%;margin:0;min-width:.5%;min-width:0;mix-blend-mode:multiply;padding:0;position:absolute}.blocks_blockSpan__-rVfz:focus,.blocks_blockSpan__-rVfz:hover{box-shadow:inset 0 0 0 .2rem #0000004d;outline:none}.blocks_res-0__pFlet{--level-1:#bd96ee;--level-2:#9250e2;--level-3:#7c2cdd;--level-4:#681fc1;--level-5:#4c178c;--level-6:#391169}.blocks_res-300000__YMCfv{--level-1:#f15bb5;--level-2:#ef43aa;--level-3:#eb1e99;--level-4:#ce1283;--level-5:#a90f6b;--level-6:#830b53}.blocks_res-3600000__c4rnR{--level-1:#70dbff;--level-2:#47d1ff;--level-3:#1fc7ff;--level-4:#00b8f5;--level-5:#09c;--level-6:#007aa3}.blocks_level-1__mY8uI{background:var(--level-1)}.blocks_level-2__tLoFQ{background:var(--level-2)}.blocks_level-3__Tt6M3{background:var(--level-3)}.blocks_level-4__adSpx{background:var(--level-4)}.blocks_level-5__A2uEj{background:var(--level-5)}.blocks_level-6__93k19{background:var(--level-6)}.blocks_blockInput__Ktii1{margin-bottom:12px}.blocks_blockFilter__qqbPg{align-items:center;display:flex;flex-direction:row}.rc-slider{border-radius:6px;height:14px;padding:5px 0;position:relative;touch-action:none;width:100%}.rc-slider,.rc-slider *{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing:border-box}.rc-slider-rail{background-color:#e9e9e9;width:100%}.rc-slider-rail,.rc-slider-track{border-radius:6px;height:4px;position:absolute}.rc-slider-track{background-color:#abe2fb;left:0}.rc-slider-handle{background-color:#fff;border:2px solid #96dbfa;border-radius:50%;cursor:pointer;cursor:-webkit-grab;cursor:grab;height:14px;margin-top:-5px;position:absolute;touch-action:pan-x;width:14px}.rc-slider-handle-dragging.rc-slider-handle-dragging.rc-slider-handle-dragging{border-color:#57c5f7;box-shadow:0 0 0 5px #96dbfa}.rc-slider-handle:focus{outline:none}.rc-slider-handle-click-focused:focus{border-color:#96dbfa;box-shadow:unset}.rc-slider-handle:hover{border-color:#57c5f7}.rc-slider-handle:active{border-color:#57c5f7;box-shadow:0 0 5px #57c5f7;cursor:grabbing}.rc-slider-mark{font-size:12px;left:0;position:absolute;top:18px;width:100%}.rc-slider-mark-text{color:#999;cursor:pointer;display:inline-block;position:absolute;text-align:center;vertical-align:middle}.rc-slider-mark-text-active{color:#666}.rc-slider-step{background:#0000;height:4px;position:absolute;width:100%}.rc-slider-dot{background-color:#fff;border:2px solid #e9e9e9;border-radius:50%;bottom:-2px;cursor:pointer;height:8px;margin-left:-4px;position:absolute;vertical-align:middle;width:8px}.rc-slider-dot-active{border-color:#96dbfa}.rc-slider-dot-reverse{margin-right:-4px}.rc-slider-disabled{background-color:#e9e9e9}.rc-slider-disabled .rc-slider-track{background-color:#ccc}.rc-slider-disabled .rc-slider-dot,.rc-slider-disabled .rc-slider-handle{background-color:#fff;border-color:#ccc;box-shadow:none;cursor:not-allowed}.rc-slider-disabled .rc-slider-dot,.rc-slider-disabled .rc-slider-mark-text{cursor:not-allowed!important}.rc-slider-vertical{height:100%;padding:0 5px;width:14px}.rc-slider-vertical .rc-slider-rail{height:100%;width:4px}.rc-slider-vertical .rc-slider-track{bottom:0;left:5px;width:4px}.rc-slider-vertical .rc-slider-handle{margin-left:-5px;touch-action:pan-y}.rc-slider-vertical .rc-slider-mark{height:100%;left:18px;top:0}.rc-slider-vertical .rc-slider-step{height:100%;width:4px}.rc-slider-vertical .rc-slider-dot{left:2px;margin-bottom:-4px}.rc-slider-vertical .rc-slider-dot:first-child,.rc-slider-vertical .rc-slider-dot:last-child{margin-bottom:-4px}.rc-slider-tooltip-zoom-down-appear,.rc-slider-tooltip-zoom-down-enter,.rc-slider-tooltip-zoom-down-leave{animation-duration:.3s;animation-fill-mode:both;animation-play-state:paused;display:block!important}.rc-slider-tooltip-zoom-down-appear.rc-slider-tooltip-zoom-down-appear-active,.rc-slider-tooltip-zoom-down-enter.rc-slider-tooltip-zoom-down-enter-active{animation-name:rcSliderTooltipZoomDownIn;animation-play-state:running}.rc-slider-tooltip-zoom-down-leave.rc-slider-tooltip-zoom-down-leave-active{animation-name:rcSliderTooltipZoomDownOut;animation-play-state:running}.rc-slider-tooltip-zoom-down-appear,.rc-slider-tooltip-zoom-down-enter{animation-timing-function:cubic-bezier(.23,1,.32,1);transform:scale(0)}.rc-slider-tooltip-zoom-down-leave{animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@keyframes rcSliderTooltipZoomDownIn{0%{opacity:0;transform:scale(0);transform-origin:50% 100%}to{transform:scale(1);transform-origin:50% 100%}}@keyframes rcSliderTooltipZoomDownOut{0%{transform:scale(1);transform-origin:50% 100%}to{opacity:0;transform:scale(0);transform-origin:50% 100%}}.rc-slider-tooltip{left:-9999px;position:absolute;top:-9999px;visibility:visible}.rc-slider-tooltip,.rc-slider-tooltip *{-webkit-tap-highlight-color:rgba(0,0,0,0);box-sizing:border-box}.rc-slider-tooltip-hidden{display:none}.rc-slider-tooltip-placement-top{padding:4px 0 8px}.rc-slider-tooltip-inner{background-color:#6c6c6c;border-radius:6px;box-shadow:0 0 4px #d9d9d9;color:#fff;font-size:12px;height:24px;line-height:1;min-width:24px;padding:6px 2px;text-align:center;text-decoration:none}.rc-slider-tooltip-arrow{border-color:#0000;border-style:solid;height:0;position:absolute;width:0}.rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow{border-top-color:#6c6c6c;border-width:4px 4px 0;bottom:4px;left:50%;margin-left:-4px}html{scroll-padding-top:56px}@font-face{font-family:codicon;src:local("codicon"),url(../../static/media/codicon.b3726f0165bf67ac6849.ttf) format("truetype")}*,:after,:before{box-sizing:border-box}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#fff;color:#212529;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;font-weight:400;line-height:1.5;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:initial;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}a{background-color:initial;color:#007bff;text-decoration:none}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#6c757d;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}body.bootstrap{background-color:#fff;color:#212529;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;font-weight:400;line-height:1.5;margin:0;text-align:left}.bootstrap :root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.bootstrap .h1,.bootstrap .h2,.bootstrap .h3,.bootstrap .h4,.bootstrap .h5,.bootstrap .h6,.bootstrap h1,.bootstrap h2,.bootstrap h3,.bootstrap h4,.bootstrap h5,.bootstrap h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.bootstrap .h1,.bootstrap h1{font-size:2.5rem}.bootstrap .h2,.bootstrap h2{font-size:2rem}.bootstrap .h3,.bootstrap h3{font-size:1.75rem}.bootstrap .h4,.bootstrap h4{font-size:1.5rem}.bootstrap .h5,.bootstrap h5{font-size:1.25rem}.bootstrap .h6,.bootstrap h6{font-size:1rem}.bootstrap .lead{font-size:1.25rem;font-weight:300}.bootstrap .display-1{font-size:6rem;font-weight:300;line-height:1.2}.bootstrap .display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.bootstrap .display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.bootstrap .display-4{font-size:3.5rem;font-weight:300;line-height:1.2}.bootstrap hr{border:0;border-top:1px solid #0000001a;margin-bottom:1rem;margin-top:1rem}.bootstrap .small,.bootstrap small{font-size:80%;font-weight:400}.bootstrap .mark,.bootstrap mark{background-color:#fcf8e3;padding:.2em}.bootstrap .list-inline,.bootstrap .list-unstyled{list-style:none;padding-left:0}.bootstrap .list-inline-item{display:inline-block}.bootstrap .list-inline-item:not(:last-child){margin-right:.5rem}.bootstrap .initialism{font-size:90%;text-transform:uppercase}.bootstrap .blockquote{font-size:1.25rem;margin-bottom:1rem}.bootstrap .blockquote-footer{color:#6c757d;display:block;font-size:80%}.bootstrap .blockquote-footer:before{content:"— "}.bootstrap .img-fluid,.bootstrap .img-thumbnail{height:auto;max-width:100%}.bootstrap .img-thumbnail{background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;padding:.25rem}.bootstrap .figure{display:inline-block}.bootstrap .figure-img{line-height:1;margin-bottom:.5rem}.bootstrap .figure-caption{color:#6c757d;font-size:90%}.bootstrap code{word-wrap:break-word;color:#e83e8c;font-size:87.5%}a>.bootstrap code{color:inherit}.bootstrap kbd{background-color:#212529;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}.bootstrap kbd kbd{font-size:100%;font-weight:700;padding:0}.bootstrap pre{color:#212529;display:block;font-size:87.5%}.bootstrap pre code{color:inherit;font-size:inherit;word-break:normal}.bootstrap .pre-scrollable{max-height:340px;overflow-y:scroll}.bootstrap .container,.bootstrap .container-fluid,.bootstrap .container-lg,.bootstrap .container-md,.bootstrap .container-sm,.bootstrap .container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media(min-width:576px){.bootstrap .container,.bootstrap .container-sm{max-width:540px}}@media(min-width:768px){.bootstrap .container,.bootstrap .container-md,.bootstrap .container-sm{max-width:720px}}@media(min-width:992px){.bootstrap .container,.bootstrap .container-lg,.bootstrap .container-md,.bootstrap .container-sm{max-width:960px}}@media(min-width:1200px){.bootstrap .container,.bootstrap .container-lg,.bootstrap .container-md,.bootstrap .container-sm,.bootstrap .container-xl{max-width:1140px}}.bootstrap .row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.bootstrap .no-gutters{margin-left:0;margin-right:0}.bootstrap .no-gutters>.col,.bootstrap .no-gutters>[class*=col-]{padding-left:0;padding-right:0}.bootstrap .col,.bootstrap .col-1,.bootstrap .col-10,.bootstrap .col-11,.bootstrap .col-12,.bootstrap .col-2,.bootstrap .col-3,.bootstrap .col-4,.bootstrap .col-5,.bootstrap .col-6,.bootstrap .col-7,.bootstrap .col-8,.bootstrap .col-9,.bootstrap .col-auto,.bootstrap .col-lg,.bootstrap .col-lg-1,.bootstrap .col-lg-10,.bootstrap .col-lg-11,.bootstrap .col-lg-12,.bootstrap .col-lg-2,.bootstrap .col-lg-3,.bootstrap .col-lg-4,.bootstrap .col-lg-5,.bootstrap .col-lg-6,.bootstrap .col-lg-7,.bootstrap .col-lg-8,.bootstrap .col-lg-9,.bootstrap .col-lg-auto,.bootstrap .col-md,.bootstrap .col-md-1,.bootstrap .col-md-10,.bootstrap .col-md-11,.bootstrap .col-md-12,.bootstrap .col-md-2,.bootstrap .col-md-3,.bootstrap .col-md-4,.bootstrap .col-md-5,.bootstrap .col-md-6,.bootstrap .col-md-7,.bootstrap .col-md-8,.bootstrap .col-md-9,.bootstrap .col-md-auto,.bootstrap .col-sm,.bootstrap .col-sm-1,.bootstrap .col-sm-10,.bootstrap .col-sm-11,.bootstrap .col-sm-12,.bootstrap .col-sm-2,.bootstrap .col-sm-3,.bootstrap .col-sm-4,.bootstrap .col-sm-5,.bootstrap .col-sm-6,.bootstrap .col-sm-7,.bootstrap .col-sm-8,.bootstrap .col-sm-9,.bootstrap .col-sm-auto,.bootstrap .col-xl,.bootstrap .col-xl-1,.bootstrap .col-xl-10,.bootstrap .col-xl-11,.bootstrap .col-xl-12,.bootstrap .col-xl-2,.bootstrap .col-xl-3,.bootstrap .col-xl-4,.bootstrap .col-xl-5,.bootstrap .col-xl-6,.bootstrap .col-xl-7,.bootstrap .col-xl-8,.bootstrap .col-xl-9,.bootstrap .col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.bootstrap .col{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap .row-cols-1>*{flex:0 0 100%;max-width:100%}.bootstrap .row-cols-2>*{flex:0 0 50%;max-width:50%}.bootstrap .row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap .row-cols-4>*{flex:0 0 25%;max-width:25%}.bootstrap .row-cols-5>*{flex:0 0 20%;max-width:20%}.bootstrap .row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap .col-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap .col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap .col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap .col-3{flex:0 0 25%;max-width:25%}.bootstrap .col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap .col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap .col-6{flex:0 0 50%;max-width:50%}.bootstrap .col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap .col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap .col-9{flex:0 0 75%;max-width:75%}.bootstrap .col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap .col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap .col-12{flex:0 0 100%;max-width:100%}.bootstrap .order-first{order:-1}.bootstrap .order-last{order:13}.bootstrap .order-0{order:0}.bootstrap .order-1{order:1}.bootstrap .order-2{order:2}.bootstrap .order-3{order:3}.bootstrap .order-4{order:4}.bootstrap .order-5{order:5}.bootstrap .order-6{order:6}.bootstrap .order-7{order:7}.bootstrap .order-8{order:8}.bootstrap .order-9{order:9}.bootstrap .order-10{order:10}.bootstrap .order-11{order:11}.bootstrap .order-12{order:12}.bootstrap .offset-1{margin-left:8.33333333%}.bootstrap .offset-2{margin-left:16.66666667%}.bootstrap .offset-3{margin-left:25%}.bootstrap .offset-4{margin-left:33.33333333%}.bootstrap .offset-5{margin-left:41.66666667%}.bootstrap .offset-6{margin-left:50%}.bootstrap .offset-7{margin-left:58.33333333%}.bootstrap .offset-8{margin-left:66.66666667%}.bootstrap .offset-9{margin-left:75%}.bootstrap .offset-10{margin-left:83.33333333%}.bootstrap .offset-11{margin-left:91.66666667%}@media(min-width:576px){.bootstrap .col-sm{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap .row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.bootstrap .row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.bootstrap .row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap .row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.bootstrap .row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.bootstrap .row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap .col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap .col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap .col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap .col-sm-3{flex:0 0 25%;max-width:25%}.bootstrap .col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap .col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap .col-sm-6{flex:0 0 50%;max-width:50%}.bootstrap .col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap .col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap .col-sm-9{flex:0 0 75%;max-width:75%}.bootstrap .col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap .col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap .col-sm-12{flex:0 0 100%;max-width:100%}.bootstrap .order-sm-first{order:-1}.bootstrap .order-sm-last{order:13}.bootstrap .order-sm-0{order:0}.bootstrap .order-sm-1{order:1}.bootstrap .order-sm-2{order:2}.bootstrap .order-sm-3{order:3}.bootstrap .order-sm-4{order:4}.bootstrap .order-sm-5{order:5}.bootstrap .order-sm-6{order:6}.bootstrap .order-sm-7{order:7}.bootstrap .order-sm-8{order:8}.bootstrap .order-sm-9{order:9}.bootstrap .order-sm-10{order:10}.bootstrap .order-sm-11{order:11}.bootstrap .order-sm-12{order:12}.bootstrap .offset-sm-0{margin-left:0}.bootstrap .offset-sm-1{margin-left:8.33333333%}.bootstrap .offset-sm-2{margin-left:16.66666667%}.bootstrap .offset-sm-3{margin-left:25%}.bootstrap .offset-sm-4{margin-left:33.33333333%}.bootstrap .offset-sm-5{margin-left:41.66666667%}.bootstrap .offset-sm-6{margin-left:50%}.bootstrap .offset-sm-7{margin-left:58.33333333%}.bootstrap .offset-sm-8{margin-left:66.66666667%}.bootstrap .offset-sm-9{margin-left:75%}.bootstrap .offset-sm-10{margin-left:83.33333333%}.bootstrap .offset-sm-11{margin-left:91.66666667%}}@media(min-width:768px){.bootstrap .col-md{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap .row-cols-md-1>*{flex:0 0 100%;max-width:100%}.bootstrap .row-cols-md-2>*{flex:0 0 50%;max-width:50%}.bootstrap .row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap .row-cols-md-4>*{flex:0 0 25%;max-width:25%}.bootstrap .row-cols-md-5>*{flex:0 0 20%;max-width:20%}.bootstrap .row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap .col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap .col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap .col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap .col-md-3{flex:0 0 25%;max-width:25%}.bootstrap .col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap .col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap .col-md-6{flex:0 0 50%;max-width:50%}.bootstrap .col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap .col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap .col-md-9{flex:0 0 75%;max-width:75%}.bootstrap .col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap .col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap .col-md-12{flex:0 0 100%;max-width:100%}.bootstrap .order-md-first{order:-1}.bootstrap .order-md-last{order:13}.bootstrap .order-md-0{order:0}.bootstrap .order-md-1{order:1}.bootstrap .order-md-2{order:2}.bootstrap .order-md-3{order:3}.bootstrap .order-md-4{order:4}.bootstrap .order-md-5{order:5}.bootstrap .order-md-6{order:6}.bootstrap .order-md-7{order:7}.bootstrap .order-md-8{order:8}.bootstrap .order-md-9{order:9}.bootstrap .order-md-10{order:10}.bootstrap .order-md-11{order:11}.bootstrap .order-md-12{order:12}.bootstrap .offset-md-0{margin-left:0}.bootstrap .offset-md-1{margin-left:8.33333333%}.bootstrap .offset-md-2{margin-left:16.66666667%}.bootstrap .offset-md-3{margin-left:25%}.bootstrap .offset-md-4{margin-left:33.33333333%}.bootstrap .offset-md-5{margin-left:41.66666667%}.bootstrap .offset-md-6{margin-left:50%}.bootstrap .offset-md-7{margin-left:58.33333333%}.bootstrap .offset-md-8{margin-left:66.66666667%}.bootstrap .offset-md-9{margin-left:75%}.bootstrap .offset-md-10{margin-left:83.33333333%}.bootstrap .offset-md-11{margin-left:91.66666667%}}@media(min-width:992px){.bootstrap .col-lg{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap .row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.bootstrap .row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.bootstrap .row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap .row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.bootstrap .row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.bootstrap .row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap .col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap .col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap .col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap .col-lg-3{flex:0 0 25%;max-width:25%}.bootstrap .col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap .col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap .col-lg-6{flex:0 0 50%;max-width:50%}.bootstrap .col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap .col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap .col-lg-9{flex:0 0 75%;max-width:75%}.bootstrap .col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap .col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap .col-lg-12{flex:0 0 100%;max-width:100%}.bootstrap .order-lg-first{order:-1}.bootstrap .order-lg-last{order:13}.bootstrap .order-lg-0{order:0}.bootstrap .order-lg-1{order:1}.bootstrap .order-lg-2{order:2}.bootstrap .order-lg-3{order:3}.bootstrap .order-lg-4{order:4}.bootstrap .order-lg-5{order:5}.bootstrap .order-lg-6{order:6}.bootstrap .order-lg-7{order:7}.bootstrap .order-lg-8{order:8}.bootstrap .order-lg-9{order:9}.bootstrap .order-lg-10{order:10}.bootstrap .order-lg-11{order:11}.bootstrap .order-lg-12{order:12}.bootstrap .offset-lg-0{margin-left:0}.bootstrap .offset-lg-1{margin-left:8.33333333%}.bootstrap .offset-lg-2{margin-left:16.66666667%}.bootstrap .offset-lg-3{margin-left:25%}.bootstrap .offset-lg-4{margin-left:33.33333333%}.bootstrap .offset-lg-5{margin-left:41.66666667%}.bootstrap .offset-lg-6{margin-left:50%}.bootstrap .offset-lg-7{margin-left:58.33333333%}.bootstrap .offset-lg-8{margin-left:66.66666667%}.bootstrap .offset-lg-9{margin-left:75%}.bootstrap .offset-lg-10{margin-left:83.33333333%}.bootstrap .offset-lg-11{margin-left:91.66666667%}}@media(min-width:1200px){.bootstrap .col-xl{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap .row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.bootstrap .row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.bootstrap .row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap .row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.bootstrap .row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.bootstrap .row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap .col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap .col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap .col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap .col-xl-3{flex:0 0 25%;max-width:25%}.bootstrap .col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap .col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap .col-xl-6{flex:0 0 50%;max-width:50%}.bootstrap .col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap .col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap .col-xl-9{flex:0 0 75%;max-width:75%}.bootstrap .col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap .col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap .col-xl-12{flex:0 0 100%;max-width:100%}.bootstrap .order-xl-first{order:-1}.bootstrap .order-xl-last{order:13}.bootstrap .order-xl-0{order:0}.bootstrap .order-xl-1{order:1}.bootstrap .order-xl-2{order:2}.bootstrap .order-xl-3{order:3}.bootstrap .order-xl-4{order:4}.bootstrap .order-xl-5{order:5}.bootstrap .order-xl-6{order:6}.bootstrap .order-xl-7{order:7}.bootstrap .order-xl-8{order:8}.bootstrap .order-xl-9{order:9}.bootstrap .order-xl-10{order:10}.bootstrap .order-xl-11{order:11}.bootstrap .order-xl-12{order:12}.bootstrap .offset-xl-0{margin-left:0}.bootstrap .offset-xl-1{margin-left:8.33333333%}.bootstrap .offset-xl-2{margin-left:16.66666667%}.bootstrap .offset-xl-3{margin-left:25%}.bootstrap .offset-xl-4{margin-left:33.33333333%}.bootstrap .offset-xl-5{margin-left:41.66666667%}.bootstrap .offset-xl-6{margin-left:50%}.bootstrap .offset-xl-7{margin-left:58.33333333%}.bootstrap .offset-xl-8{margin-left:66.66666667%}.bootstrap .offset-xl-9{margin-left:75%}.bootstrap .offset-xl-10{margin-left:83.33333333%}.bootstrap .offset-xl-11{margin-left:91.66666667%}}.bootstrap .table{color:#212529;margin-bottom:1rem;width:100%}.bootstrap .table td,.bootstrap .table th{border-top:1px solid #dee2e6;padding:.75rem;vertical-align:top}.bootstrap .table thead th{border-bottom:2px solid #dee2e6;vertical-align:bottom}.bootstrap .table tbody+tbody{border-top:2px solid #dee2e6}.bootstrap .table-sm td,.bootstrap .table-sm th{padding:.3rem}.bootstrap .table-bordered,.bootstrap .table-bordered td,.bootstrap .table-bordered th{border:1px solid #dee2e6}.bootstrap .table-bordered thead td,.bootstrap .table-bordered thead th{border-bottom-width:2px}.bootstrap .table-borderless tbody+tbody,.bootstrap .table-borderless td,.bootstrap .table-borderless th,.bootstrap .table-borderless thead th{border:0}.bootstrap .table-striped tbody tr:nth-of-type(odd){background-color:#0000000d}.bootstrap .table-hover tbody tr:hover{background-color:rgba(0,0,0,.075);color:#212529}.bootstrap .table-primary,.bootstrap .table-primary>td,.bootstrap .table-primary>th{background-color:#b8daff}.bootstrap .table-primary tbody+tbody,.bootstrap .table-primary td,.bootstrap .table-primary th,.bootstrap .table-primary thead th{border-color:#7abaff}.bootstrap .table-hover .table-primary:hover,.bootstrap .table-hover .table-primary:hover>td,.bootstrap .table-hover .table-primary:hover>th{background-color:#9fcdff}.bootstrap .table-secondary,.bootstrap .table-secondary>td,.bootstrap .table-secondary>th{background-color:#d6d8db}.bootstrap .table-secondary tbody+tbody,.bootstrap .table-secondary td,.bootstrap .table-secondary th,.bootstrap .table-secondary thead th{border-color:#b3b7bb}.bootstrap .table-hover .table-secondary:hover,.bootstrap .table-hover .table-secondary:hover>td,.bootstrap .table-hover .table-secondary:hover>th{background-color:#c8cbcf}.bootstrap .table-success,.bootstrap .table-success>td,.bootstrap .table-success>th{background-color:#c3e6cb}.bootstrap .table-success tbody+tbody,.bootstrap .table-success td,.bootstrap .table-success th,.bootstrap .table-success thead th{border-color:#8fd19e}.bootstrap .table-hover .table-success:hover,.bootstrap .table-hover .table-success:hover>td,.bootstrap .table-hover .table-success:hover>th{background-color:#b1dfbb}.bootstrap .table-info,.bootstrap .table-info>td,.bootstrap .table-info>th{background-color:#bee5eb}.bootstrap .table-info tbody+tbody,.bootstrap .table-info td,.bootstrap .table-info th,.bootstrap .table-info thead th{border-color:#86cfda}.bootstrap .table-hover .table-info:hover,.bootstrap .table-hover .table-info:hover>td,.bootstrap .table-hover .table-info:hover>th{background-color:#abdde5}.bootstrap .table-warning,.bootstrap .table-warning>td,.bootstrap .table-warning>th{background-color:#ffeeba}.bootstrap .table-warning tbody+tbody,.bootstrap .table-warning td,.bootstrap .table-warning th,.bootstrap .table-warning thead th{border-color:#ffdf7e}.bootstrap .table-hover .table-warning:hover,.bootstrap .table-hover .table-warning:hover>td,.bootstrap .table-hover .table-warning:hover>th{background-color:#ffe8a1}.bootstrap .table-danger,.bootstrap .table-danger>td,.bootstrap .table-danger>th{background-color:#f5c6cb}.bootstrap .table-danger tbody+tbody,.bootstrap .table-danger td,.bootstrap .table-danger th,.bootstrap .table-danger thead th{border-color:#ed969e}.bootstrap .table-hover .table-danger:hover,.bootstrap .table-hover .table-danger:hover>td,.bootstrap .table-hover .table-danger:hover>th{background-color:#f1b0b7}.bootstrap .table-light,.bootstrap .table-light>td,.bootstrap .table-light>th{background-color:#fdfdfe}.bootstrap .table-light tbody+tbody,.bootstrap .table-light td,.bootstrap .table-light th,.bootstrap .table-light thead th{border-color:#fbfcfc}.bootstrap .table-hover .table-light:hover,.bootstrap .table-hover .table-light:hover>td,.bootstrap .table-hover .table-light:hover>th{background-color:#ececf6}.bootstrap .table-dark,.bootstrap .table-dark>td,.bootstrap .table-dark>th{background-color:#c6c8ca}.bootstrap .table-dark tbody+tbody,.bootstrap .table-dark td,.bootstrap .table-dark th,.bootstrap .table-dark thead th{border-color:#95999c}.bootstrap .table-hover .table-dark:hover,.bootstrap .table-hover .table-dark:hover>td,.bootstrap .table-hover .table-dark:hover>th{background-color:#b9bbbe}.bootstrap .table-active,.bootstrap .table-active>td,.bootstrap .table-active>th,.bootstrap .table-hover .table-active:hover,.bootstrap .table-hover .table-active:hover>td,.bootstrap .table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.bootstrap .table .thead-dark th{background-color:#343a40;border-color:#454d55;color:#fff}.bootstrap .table .thead-light th{background-color:#e9ecef;border-color:#dee2e6;color:#495057}.bootstrap .table-dark{background-color:#343a40;color:#fff}.bootstrap .table-dark td,.bootstrap .table-dark th,.bootstrap .table-dark thead th{border-color:#454d55}.bootstrap .table-dark.table-bordered{border:0}.bootstrap .table-dark.table-striped tbody tr:nth-of-type(odd){background-color:#ffffff0d}.bootstrap .table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media(max-width:575.98px){.bootstrap .table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap .table-responsive-sm>.table-bordered{border:0}}@media(max-width:767.98px){.bootstrap .table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap .table-responsive-md>.table-bordered{border:0}}@media(max-width:991.98px){.bootstrap .table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap .table-responsive-lg>.table-bordered{border:0}}@media(max-width:1199.98px){.bootstrap .table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap .table-responsive-xl>.table-bordered{border:0}}.bootstrap .table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap .table-responsive>.table-bordered{border:0}.bootstrap .form-control{background-clip:padding-box;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.bootstrap .form-control{transition:none}}.bootstrap .form-control::-ms-expand{background-color:initial;border:0}.bootstrap .form-control:focus{background-color:#fff;border-color:#80bdff;box-shadow:0 0 0 .2rem #007bff40;color:#495057;outline:0}.bootstrap .form-control::placeholder{color:#6c757d;opacity:1}.bootstrap .form-control:disabled,.bootstrap .form-control[readonly]{background-color:#e9ecef;opacity:1}.bootstrap input[type=date].form-control,.bootstrap input[type=datetime-local].form-control,.bootstrap input[type=month].form-control,.bootstrap input[type=time].form-control{-webkit-appearance:none;appearance:none}.bootstrap select.form-control:-moz-focusring{color:#0000;text-shadow:0 0 0 #495057}.bootstrap select.form-control:focus::-ms-value{background-color:#fff;color:#495057}.bootstrap .form-control-file,.bootstrap .form-control-range{display:block;width:100%}.bootstrap .col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.bootstrap .col-form-label-lg{font-size:1.25rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.bootstrap .col-form-label-sm{font-size:.875rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.bootstrap .form-control-plaintext{background-color:initial;border:solid #0000;border-width:1px 0;color:#212529;display:block;font-size:1rem;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.bootstrap .form-control-plaintext.form-control-lg,.bootstrap .form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.bootstrap .form-control-sm{border-radius:.2rem;font-size:.875rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.bootstrap .form-control-lg{border-radius:.3rem;font-size:1.25rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}.bootstrap select.form-control[multiple],.bootstrap select.form-control[size],.bootstrap textarea.form-control{height:auto}.bootstrap .form-group{margin-bottom:1rem}.bootstrap .form-text{display:block;margin-top:.25rem}.bootstrap .form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.bootstrap .form-row>.col,.bootstrap .form-row>[class*=col-]{padding-left:5px;padding-right:5px}.bootstrap .form-check{display:block;padding-left:1.25rem;position:relative}.bootstrap .form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.bootstrap .form-check-input:disabled~.form-check-label,.bootstrap .form-check-input[disabled]~.form-check-label{color:#6c757d}.bootstrap .form-check-label{margin-bottom:0}.bootstrap .form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.bootstrap .form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.bootstrap .valid-feedback{color:#28a745;display:none;font-size:80%;margin-top:.25rem;width:100%}.bootstrap .valid-tooltip{background-color:#28a745e6;border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.bootstrap .valid-tooltip,.form-row>[class*=col-]>.bootstrap .valid-tooltip{left:5px}.bootstrap .is-valid~.valid-feedback,.bootstrap .is-valid~.valid-tooltip{display:block}.bootstrap .form-control.is-valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#28a745;padding-right:calc(1.5em + .75rem)!important}.bootstrap .form-control.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap select.form-control.is-valid{background-position:right 1.5rem center;padding-right:3rem!important}.bootstrap textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.bootstrap .custom-select.is-valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important}.bootstrap .custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap .form-check-input.is-valid~.form-check-label{color:#28a745}.bootstrap .form-check-input.is-valid~.valid-feedback,.bootstrap .form-check-input.is-valid~.valid-tooltip{display:block}.bootstrap .custom-control-input.is-valid~.custom-control-label{color:#28a745}.bootstrap .custom-control-input.is-valid~.custom-control-label:before{border-color:#28a745}.bootstrap .custom-control-input.is-valid:checked~.custom-control-label:before{background-color:#34ce57;border-color:#34ce57}.bootstrap .custom-control-input.is-valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #28a74540}.bootstrap .custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.bootstrap .custom-file-input.is-valid~.custom-file-label{border-color:#28a745}.bootstrap .custom-file-input.is-valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap .invalid-feedback{color:#dc3545;display:none;font-size:80%;margin-top:.25rem;width:100%}.bootstrap .invalid-tooltip{background-color:#dc3545e6;border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.bootstrap .invalid-tooltip,.form-row>[class*=col-]>.bootstrap .invalid-tooltip{left:5px}.bootstrap .is-invalid~.invalid-feedback,.bootstrap .is-invalid~.invalid-tooltip{display:block}.bootstrap .form-control.is-invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important}.bootstrap .form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap select.form-control.is-invalid{background-position:right 1.5rem center;padding-right:3rem!important}.bootstrap textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.bootstrap .custom-select.is-invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important}.bootstrap .custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap .form-check-input.is-invalid~.form-check-label{color:#dc3545}.bootstrap .form-check-input.is-invalid~.invalid-feedback,.bootstrap .form-check-input.is-invalid~.invalid-tooltip{display:block}.bootstrap .custom-control-input.is-invalid~.custom-control-label{color:#dc3545}.bootstrap .custom-control-input.is-invalid~.custom-control-label:before{border-color:#dc3545}.bootstrap .custom-control-input.is-invalid:checked~.custom-control-label:before{background-color:#e4606d;border-color:#e4606d}.bootstrap .custom-control-input.is-invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #dc354540}.bootstrap .custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.bootstrap .custom-file-input.is-invalid~.custom-file-label{border-color:#dc3545}.bootstrap .custom-file-input.is-invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap .form-inline{align-items:center;display:flex;flex-flow:row wrap}.bootstrap .form-inline .form-check{width:100%}@media(min-width:576px){.bootstrap .form-inline label{align-items:center;display:flex;justify-content:center;margin-bottom:0}.bootstrap .form-inline .form-group{align-items:center;display:flex;flex:0 0 auto;flex-flow:row wrap;margin-bottom:0}.bootstrap .form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.bootstrap .form-inline .form-control-plaintext{display:inline-block}.bootstrap .form-inline .custom-select,.bootstrap .form-inline .input-group{width:auto}.bootstrap .form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.bootstrap .form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.bootstrap .form-inline .custom-control{align-items:center;justify-content:center}.bootstrap .form-inline .custom-control-label{margin-bottom:0}}.bootstrap .was-validated .valid-feedback{color:#28a745;display:none;font-size:80%;margin-top:.25rem;width:100%}.bootstrap .was-validated .valid-tooltip{background-color:#28a745e6;border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.bootstrap .was-validated .valid-tooltip,.form-row>[class*=col-]>.bootstrap .was-validated .valid-tooltip{left:5px}.bootstrap .was-validated.is-valid~.valid-feedback,.bootstrap .was-validated.is-valid~.valid-tooltip,.bootstrap .was-validated:valid~.valid-feedback,.bootstrap .was-validated:valid~.valid-tooltip{display:block}.bootstrap .was-validated .form-control.is-valid,.bootstrap .was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#28a745;padding-right:calc(1.5em + .75rem)!important}.bootstrap .was-validated .form-control.is-valid:focus,.bootstrap .was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap .was-validated select.form-control.is-valid,.bootstrap .was-validated select.form-control:valid{background-position:right 1.5rem center;padding-right:3rem!important}.bootstrap .was-validated textarea.form-control.is-valid,.bootstrap .was-validated textarea.form-control:valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.bootstrap .was-validated .custom-select.is-valid,.bootstrap .was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important}.bootstrap .was-validated .custom-select.is-valid:focus,.bootstrap .was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap .was-validated .form-check-input.is-valid~.form-check-label,.bootstrap .was-validated .form-check-input:valid~.form-check-label{color:#28a745}.bootstrap .was-validated .form-check-input.is-valid~.valid-feedback,.bootstrap .was-validated .form-check-input.is-valid~.valid-tooltip,.bootstrap .was-validated .form-check-input:valid~.valid-feedback,.bootstrap .was-validated .form-check-input:valid~.valid-tooltip{display:block}.bootstrap .was-validated .custom-control-input.is-valid~.custom-control-label,.bootstrap .was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.bootstrap .was-validated .custom-control-input.is-valid~.custom-control-label:before,.bootstrap .was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.bootstrap .was-validated .custom-control-input.is-valid:checked~.custom-control-label:before,.bootstrap .was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#34ce57;border-color:#34ce57}.bootstrap .was-validated .custom-control-input.is-valid:focus~.custom-control-label:before,.bootstrap .was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #28a74540}.bootstrap .was-validated .custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.bootstrap .was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.bootstrap .was-validated .custom-file-input.is-valid~.custom-file-label,.bootstrap .was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.bootstrap .was-validated .custom-file-input.is-valid:focus~.custom-file-label,.bootstrap .was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap .was-validated .is-valid~.valid-feedback,.bootstrap .was-validated .is-valid~.valid-tooltip,.bootstrap .was-validated :valid~.valid-feedback,.bootstrap .was-validated :valid~.valid-tooltip{display:block}.bootstrap .was-validated .invalid-feedback{color:#dc3545;display:none;font-size:80%;margin-top:.25rem;width:100%}.bootstrap .was-validated .invalid-tooltip{background-color:#dc3545e6;border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.bootstrap .was-validated .invalid-tooltip,.form-row>[class*=col-]>.bootstrap .was-validated .invalid-tooltip{left:5px}.bootstrap .was-validated.is-invalid~.invalid-feedback,.bootstrap .was-validated.is-invalid~.invalid-tooltip,.bootstrap .was-validated:invalid~.invalid-feedback,.bootstrap .was-validated:invalid~.invalid-tooltip{display:block}.bootstrap .was-validated .form-control.is-invalid,.bootstrap .was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important}.bootstrap .was-validated .form-control.is-invalid:focus,.bootstrap .was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap .was-validated select.form-control.is-invalid,.bootstrap .was-validated select.form-control:invalid{background-position:right 1.5rem center;padding-right:3rem!important}.bootstrap .was-validated textarea.form-control.is-invalid,.bootstrap .was-validated textarea.form-control:invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.bootstrap .was-validated .custom-select.is-invalid,.bootstrap .was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important}.bootstrap .was-validated .custom-select.is-invalid:focus,.bootstrap .was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap .was-validated .form-check-input.is-invalid~.form-check-label,.bootstrap .was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.bootstrap .was-validated .form-check-input.is-invalid~.invalid-feedback,.bootstrap .was-validated .form-check-input.is-invalid~.invalid-tooltip,.bootstrap .was-validated .form-check-input:invalid~.invalid-feedback,.bootstrap .was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.bootstrap .was-validated .custom-control-input.is-invalid~.custom-control-label,.bootstrap .was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.bootstrap .was-validated .custom-control-input.is-invalid~.custom-control-label:before,.bootstrap .was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.bootstrap .was-validated .custom-control-input.is-invalid:checked~.custom-control-label:before,.bootstrap .was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e4606d;border-color:#e4606d}.bootstrap .was-validated .custom-control-input.is-invalid:focus~.custom-control-label:before,.bootstrap .was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #dc354540}.bootstrap .was-validated .custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.bootstrap .was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.bootstrap .was-validated .custom-file-input.is-invalid~.custom-file-label,.bootstrap .was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.bootstrap .was-validated .custom-file-input.is-invalid:focus~.custom-file-label,.bootstrap .was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap .was-validated .is-invalid~.invalid-feedback,.bootstrap .was-validated .is-invalid~.invalid-tooltip,.bootstrap .was-validated :invalid~.invalid-feedback,.bootstrap .was-validated :invalid~.invalid-tooltip{display:block}.bootstrap .btn{background-color:initial;border:1px solid #0000;border-radius:.25rem;color:#212529;display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;user-select:none;vertical-align:middle}@media(prefers-reduced-motion:reduce){.bootstrap .btn{transition:none}}.bootstrap .btn:hover{color:#212529;text-decoration:none}.bootstrap .btn.focus,.bootstrap .btn:focus{box-shadow:0 0 0 .2rem #007bff40;outline:0}.bootstrap .btn.disabled,.bootstrap .btn:disabled{opacity:.65}.bootstrap .btn:not(:disabled):not(.disabled){cursor:pointer}.bootstrap a.btn.disabled,.bootstrap fieldset:disabled a.btn{pointer-events:none}.bootstrap .btn-primary{background-color:#007bff;border-color:#007bff;color:#fff}.bootstrap .btn-primary:hover{background-color:#0069d9;border-color:#0062cc;color:#fff}.bootstrap .btn-primary.focus,.bootstrap .btn-primary:focus{background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem #268fff80;color:#fff}.bootstrap .btn-primary.disabled,.bootstrap .btn-primary:disabled{background-color:#007bff;border-color:#007bff;color:#fff}.bootstrap .btn-primary:not(:disabled):not(.disabled).active,.bootstrap .btn-primary:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-primary.dropdown-toggle{background-color:#0062cc;border-color:#005cbf;color:#fff}.bootstrap .btn-primary:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-primary:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #268fff80}.bootstrap .btn-secondary{background-color:#6c757d;border-color:#6c757d;color:#fff}.bootstrap .btn-secondary:hover{background-color:#5a6268;border-color:#545b62;color:#fff}.bootstrap .btn-secondary.focus,.bootstrap .btn-secondary:focus{background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem #828a9180;color:#fff}.bootstrap .btn-secondary.disabled,.bootstrap .btn-secondary:disabled{background-color:#6c757d;border-color:#6c757d;color:#fff}.bootstrap .btn-secondary:not(:disabled):not(.disabled).active,.bootstrap .btn-secondary:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-secondary.dropdown-toggle{background-color:#545b62;border-color:#4e555b;color:#fff}.bootstrap .btn-secondary:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #828a9180}.bootstrap .btn-success{background-color:#28a745;border-color:#28a745;color:#fff}.bootstrap .btn-success:hover{background-color:#218838;border-color:#1e7e34;color:#fff}.bootstrap .btn-success.focus,.bootstrap .btn-success:focus{background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem #48b46180;color:#fff}.bootstrap .btn-success.disabled,.bootstrap .btn-success:disabled{background-color:#28a745;border-color:#28a745;color:#fff}.bootstrap .btn-success:not(:disabled):not(.disabled).active,.bootstrap .btn-success:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-success.dropdown-toggle{background-color:#1e7e34;border-color:#1c7430;color:#fff}.bootstrap .btn-success:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-success:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #48b46180}.bootstrap .btn-info{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.bootstrap .btn-info.focus,.bootstrap .btn-info:focus,.bootstrap .btn-info:hover{background-color:#138496;border-color:#117a8b;color:#fff}.bootstrap .btn-info.focus,.bootstrap .btn-info:focus{box-shadow:0 0 0 .2rem #3ab0c380}.bootstrap .btn-info.disabled,.bootstrap .btn-info:disabled{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.bootstrap .btn-info:not(:disabled):not(.disabled).active,.bootstrap .btn-info:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-info.dropdown-toggle{background-color:#117a8b;border-color:#10707f;color:#fff}.bootstrap .btn-info:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-info:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #3ab0c380}.bootstrap .btn-warning{background-color:#ffc107;border-color:#ffc107;color:#212529}.bootstrap .btn-warning:hover{background-color:#e0a800;border-color:#d39e00;color:#212529}.bootstrap .btn-warning.focus,.bootstrap .btn-warning:focus{background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem #deaa0c80;color:#212529}.bootstrap .btn-warning.disabled,.bootstrap .btn-warning:disabled{background-color:#ffc107;border-color:#ffc107;color:#212529}.bootstrap .btn-warning:not(:disabled):not(.disabled).active,.bootstrap .btn-warning:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-warning.dropdown-toggle{background-color:#d39e00;border-color:#c69500;color:#212529}.bootstrap .btn-warning:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-warning:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #deaa0c80}.bootstrap .btn-danger{background-color:#dc3545;border-color:#dc3545;color:#fff}.bootstrap .btn-danger:hover{background-color:#c82333;border-color:#bd2130;color:#fff}.bootstrap .btn-danger.focus,.bootstrap .btn-danger:focus{background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem #e1536180;color:#fff}.bootstrap .btn-danger.disabled,.bootstrap .btn-danger:disabled{background-color:#dc3545;border-color:#dc3545;color:#fff}.bootstrap .btn-danger:not(:disabled):not(.disabled).active,.bootstrap .btn-danger:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-danger.dropdown-toggle{background-color:#bd2130;border-color:#b21f2d;color:#fff}.bootstrap .btn-danger:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-danger:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #e1536180}.bootstrap .btn-light{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.bootstrap .btn-light.focus,.bootstrap .btn-light:focus,.bootstrap .btn-light:hover{background-color:#e2e6ea;border-color:#dae0e5;color:#212529}.bootstrap .btn-light.focus,.bootstrap .btn-light:focus{box-shadow:0 0 0 .2rem #d8d9db80}.bootstrap .btn-light.disabled,.bootstrap .btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.bootstrap .btn-light:not(:disabled):not(.disabled).active,.bootstrap .btn-light:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-light.dropdown-toggle{background-color:#dae0e5;border-color:#d3d9df;color:#212529}.bootstrap .btn-light:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-light:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #d8d9db80}.bootstrap .btn-dark{background-color:#343a40;border-color:#343a40;color:#fff}.bootstrap .btn-dark.focus,.bootstrap .btn-dark:focus,.bootstrap .btn-dark:hover{background-color:#23272b;border-color:#1d2124;color:#fff}.bootstrap .btn-dark.focus,.bootstrap .btn-dark:focus{box-shadow:0 0 0 .2rem #52585d80}.bootstrap .btn-dark.disabled,.bootstrap .btn-dark:disabled{background-color:#343a40;border-color:#343a40;color:#fff}.bootstrap .btn-dark:not(:disabled):not(.disabled).active,.bootstrap .btn-dark:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-dark.dropdown-toggle{background-color:#1d2124;border-color:#171a1d;color:#fff}.bootstrap .btn-dark:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-dark:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #52585d80}.bootstrap .btn-outline-primary{border-color:#007bff;color:#007bff}.bootstrap .btn-outline-primary:hover{background-color:#007bff;border-color:#007bff;color:#fff}.bootstrap .btn-outline-primary.focus,.bootstrap .btn-outline-primary:focus{box-shadow:0 0 0 .2rem #007bff80}.bootstrap .btn-outline-primary.disabled,.bootstrap .btn-outline-primary:disabled{background-color:initial;color:#007bff}.bootstrap .btn-outline-primary:not(:disabled):not(.disabled).active,.bootstrap .btn-outline-primary:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-outline-primary.dropdown-toggle{background-color:#007bff;border-color:#007bff;color:#fff}.bootstrap .btn-outline-primary:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #007bff80}.bootstrap .btn-outline-secondary{border-color:#6c757d;color:#6c757d}.bootstrap .btn-outline-secondary:hover{background-color:#6c757d;border-color:#6c757d;color:#fff}.bootstrap .btn-outline-secondary.focus,.bootstrap .btn-outline-secondary:focus{box-shadow:0 0 0 .2rem #6c757d80}.bootstrap .btn-outline-secondary.disabled,.bootstrap .btn-outline-secondary:disabled{background-color:initial;color:#6c757d}.bootstrap .btn-outline-secondary:not(:disabled):not(.disabled).active,.bootstrap .btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-outline-secondary.dropdown-toggle{background-color:#6c757d;border-color:#6c757d;color:#fff}.bootstrap .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #6c757d80}.bootstrap .btn-outline-success{border-color:#28a745;color:#28a745}.bootstrap .btn-outline-success:hover{background-color:#28a745;border-color:#28a745;color:#fff}.bootstrap .btn-outline-success.focus,.bootstrap .btn-outline-success:focus{box-shadow:0 0 0 .2rem #28a74580}.bootstrap .btn-outline-success.disabled,.bootstrap .btn-outline-success:disabled{background-color:initial;color:#28a745}.bootstrap .btn-outline-success:not(:disabled):not(.disabled).active,.bootstrap .btn-outline-success:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-outline-success.dropdown-toggle{background-color:#28a745;border-color:#28a745;color:#fff}.bootstrap .btn-outline-success:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #28a74580}.bootstrap .btn-outline-info{border-color:#17a2b8;color:#17a2b8}.bootstrap .btn-outline-info:hover{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.bootstrap .btn-outline-info.focus,.bootstrap .btn-outline-info:focus{box-shadow:0 0 0 .2rem #17a2b880}.bootstrap .btn-outline-info.disabled,.bootstrap .btn-outline-info:disabled{background-color:initial;color:#17a2b8}.bootstrap .btn-outline-info:not(:disabled):not(.disabled).active,.bootstrap .btn-outline-info:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-outline-info.dropdown-toggle{background-color:#17a2b8;border-color:#17a2b8;color:#fff}.bootstrap .btn-outline-info:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #17a2b880}.bootstrap .btn-outline-warning{border-color:#ffc107;color:#ffc107}.bootstrap .btn-outline-warning:hover{background-color:#ffc107;border-color:#ffc107;color:#212529}.bootstrap .btn-outline-warning.focus,.bootstrap .btn-outline-warning:focus{box-shadow:0 0 0 .2rem #ffc10780}.bootstrap .btn-outline-warning.disabled,.bootstrap .btn-outline-warning:disabled{background-color:initial;color:#ffc107}.bootstrap .btn-outline-warning:not(:disabled):not(.disabled).active,.bootstrap .btn-outline-warning:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-outline-warning.dropdown-toggle{background-color:#ffc107;border-color:#ffc107;color:#212529}.bootstrap .btn-outline-warning:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #ffc10780}.bootstrap .btn-outline-danger{border-color:#dc3545;color:#dc3545}.bootstrap .btn-outline-danger:hover{background-color:#dc3545;border-color:#dc3545;color:#fff}.bootstrap .btn-outline-danger.focus,.bootstrap .btn-outline-danger:focus{box-shadow:0 0 0 .2rem #dc354580}.bootstrap .btn-outline-danger.disabled,.bootstrap .btn-outline-danger:disabled{background-color:initial;color:#dc3545}.bootstrap .btn-outline-danger:not(:disabled):not(.disabled).active,.bootstrap .btn-outline-danger:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-outline-danger.dropdown-toggle{background-color:#dc3545;border-color:#dc3545;color:#fff}.bootstrap .btn-outline-danger:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #dc354580}.bootstrap .btn-outline-light{border-color:#f8f9fa;color:#f8f9fa}.bootstrap .btn-outline-light:hover{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.bootstrap .btn-outline-light.focus,.bootstrap .btn-outline-light:focus{box-shadow:0 0 0 .2rem #f8f9fa80}.bootstrap .btn-outline-light.disabled,.bootstrap .btn-outline-light:disabled{background-color:initial;color:#f8f9fa}.bootstrap .btn-outline-light:not(:disabled):not(.disabled).active,.bootstrap .btn-outline-light:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-outline-light.dropdown-toggle{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.bootstrap .btn-outline-light:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #f8f9fa80}.bootstrap .btn-outline-dark{border-color:#343a40;color:#343a40}.bootstrap .btn-outline-dark:hover{background-color:#343a40;border-color:#343a40;color:#fff}.bootstrap .btn-outline-dark.focus,.bootstrap .btn-outline-dark:focus{box-shadow:0 0 0 .2rem #343a4080}.bootstrap .btn-outline-dark.disabled,.bootstrap .btn-outline-dark:disabled{background-color:initial;color:#343a40}.bootstrap .btn-outline-dark:not(:disabled):not(.disabled).active,.bootstrap .btn-outline-dark:not(:disabled):not(.disabled):active,.show>.bootstrap .btn-outline-dark.dropdown-toggle{background-color:#343a40;border-color:#343a40;color:#fff}.bootstrap .btn-outline-dark:not(:disabled):not(.disabled).active:focus,.bootstrap .btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.bootstrap .btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #343a4080}.bootstrap .btn-link{color:#007bff;font-weight:400;text-decoration:none}.bootstrap .btn-link:hover{color:#0056b3;text-decoration:underline}.bootstrap .btn-link.focus,.bootstrap .btn-link:focus{text-decoration:underline}.bootstrap .btn-link.disabled,.bootstrap .btn-link:disabled{color:#6c757d;pointer-events:none}.bootstrap .btn-group-lg>.btn,.bootstrap .btn-lg{border-radius:.3rem;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.bootstrap .btn-group-sm>.btn,.bootstrap .btn-sm{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.bootstrap .btn-block{display:block;width:100%}.bootstrap .btn-block+.btn-block{margin-top:.5rem}.bootstrap input[type=button].btn-block,.bootstrap input[type=reset].btn-block,.bootstrap input[type=submit].btn-block{width:100%}.bootstrap .fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.bootstrap .fade{transition:none}}.bootstrap .fade:not(.show){opacity:0}.bootstrap .collapse:not(.show){display:none}.bootstrap .collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.bootstrap .collapsing{transition:none}}.bootstrap .dropdown,.bootstrap .dropleft,.bootstrap .dropright,.bootstrap .dropup{position:relative}.bootstrap .dropdown-toggle{white-space:nowrap}.bootstrap .dropdown-toggle:after{border-bottom:0;border-left:.3em solid #0000;border-right:.3em solid #0000;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.bootstrap .dropdown-toggle:empty:after{margin-left:0}.bootstrap .dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid #00000026;border-radius:.25rem;color:#212529;display:none;float:left;font-size:1rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.bootstrap .dropdown-menu-left{left:0;right:auto}.bootstrap .dropdown-menu-right{left:auto;right:0}@media(min-width:576px){.bootstrap .dropdown-menu-sm-left{left:0;right:auto}.bootstrap .dropdown-menu-sm-right{left:auto;right:0}}@media(min-width:768px){.bootstrap .dropdown-menu-md-left{left:0;right:auto}.bootstrap .dropdown-menu-md-right{left:auto;right:0}}@media(min-width:992px){.bootstrap .dropdown-menu-lg-left{left:0;right:auto}.bootstrap .dropdown-menu-lg-right{left:auto;right:0}}@media(min-width:1200px){.bootstrap .dropdown-menu-xl-left{left:0;right:auto}.bootstrap .dropdown-menu-xl-right{left:auto;right:0}}.bootstrap .dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.bootstrap .dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid #0000;border-right:.3em solid #0000;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.bootstrap .dropup .dropdown-toggle:empty:after{margin-left:0}.bootstrap .dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.bootstrap .dropright .dropdown-toggle:after{border-bottom:.3em solid #0000;border-left:.3em solid;border-right:0;border-top:.3em solid #0000;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.bootstrap .dropright .dropdown-toggle:empty:after{margin-left:0}.bootstrap .dropright .dropdown-toggle:after{vertical-align:0}.bootstrap .dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.bootstrap .dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.bootstrap .dropleft .dropdown-toggle:before{border-bottom:.3em solid #0000;border-right:.3em solid;border-top:.3em solid #0000;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.bootstrap .dropleft .dropdown-toggle:empty:after{margin-left:0}.bootstrap .dropleft .dropdown-toggle:before{vertical-align:0}.bootstrap .dropdown-menu[x-placement^=bottom],.bootstrap .dropdown-menu[x-placement^=left],.bootstrap .dropdown-menu[x-placement^=right],.bootstrap .dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.bootstrap .dropdown-divider{border-top:1px solid #e9ecef;height:0;margin:.5rem 0;overflow:hidden}.bootstrap .dropdown-item{background-color:initial;border:0;clear:both;color:#212529;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.bootstrap .dropdown-item:focus,.bootstrap .dropdown-item:hover{background-color:#e9ecef;color:#16181b;text-decoration:none}.bootstrap .dropdown-item.active,.bootstrap .dropdown-item:active{background-color:#007bff;color:#fff;text-decoration:none}.bootstrap .dropdown-item.disabled,.bootstrap .dropdown-item:disabled{background-color:initial;color:#adb5bd;pointer-events:none}.bootstrap .dropdown-menu.show{display:block}.bootstrap .dropdown-header{color:#6c757d;display:block;font-size:.875rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.bootstrap .dropdown-item-text{color:#212529;display:block;padding:.25rem 1.5rem}.bootstrap .btn-group,.bootstrap .btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.bootstrap .btn-group-vertical>.btn,.bootstrap .btn-group>.btn{flex:1 1 auto;position:relative}.bootstrap .btn-group-vertical>.btn.active,.bootstrap .btn-group-vertical>.btn:active,.bootstrap .btn-group-vertical>.btn:focus,.bootstrap .btn-group-vertical>.btn:hover,.bootstrap .btn-group>.btn.active,.bootstrap .btn-group>.btn:active,.bootstrap .btn-group>.btn:focus,.bootstrap .btn-group>.btn:hover{z-index:1}.bootstrap .btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.bootstrap .btn-toolbar .input-group{width:auto}.bootstrap .btn-group>.btn-group:not(:first-child),.bootstrap .btn-group>.btn:not(:first-child){margin-left:-1px}.bootstrap .btn-group>.btn-group:not(:last-child)>.btn,.bootstrap .btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap .btn-group>.btn-group:not(:first-child)>.btn,.bootstrap .btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap .dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.bootstrap .dropdown-toggle-split:after,.dropright .bootstrap .dropdown-toggle-split:after,.dropup .bootstrap .dropdown-toggle-split:after{margin-left:0}.dropleft .bootstrap .dropdown-toggle-split:before{margin-right:0}.bootstrap .btn-group-sm>.btn+.dropdown-toggle-split,.bootstrap .btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.bootstrap .btn-group-lg>.btn+.dropdown-toggle-split,.bootstrap .btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.bootstrap .btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.bootstrap .btn-group-vertical>.btn,.bootstrap .btn-group-vertical>.btn-group{width:100%}.bootstrap .btn-group-vertical>.btn-group:not(:first-child),.bootstrap .btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.bootstrap .btn-group-vertical>.btn-group:not(:last-child)>.btn,.bootstrap .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.bootstrap .btn-group-vertical>.btn-group:not(:first-child)>.btn,.bootstrap .btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.bootstrap .btn-group-toggle>.btn,.bootstrap .btn-group-toggle>.btn-group>.btn{margin-bottom:0}.bootstrap .btn-group-toggle>.btn input[type=checkbox],.bootstrap .btn-group-toggle>.btn input[type=radio],.bootstrap .btn-group-toggle>.btn-group>.btn input[type=checkbox],.bootstrap .btn-group-toggle>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.bootstrap .input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.bootstrap .input-group>.custom-file,.bootstrap .input-group>.custom-select,.bootstrap .input-group>.form-control,.bootstrap .input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.bootstrap .input-group>.custom-file+.custom-file,.bootstrap .input-group>.custom-file+.custom-select,.bootstrap .input-group>.custom-file+.form-control,.bootstrap .input-group>.custom-select+.custom-file,.bootstrap .input-group>.custom-select+.custom-select,.bootstrap .input-group>.custom-select+.form-control,.bootstrap .input-group>.form-control+.custom-file,.bootstrap .input-group>.form-control+.custom-select,.bootstrap .input-group>.form-control+.form-control,.bootstrap .input-group>.form-control-plaintext+.custom-file,.bootstrap .input-group>.form-control-plaintext+.custom-select,.bootstrap .input-group>.form-control-plaintext+.form-control{margin-left:-1px}.bootstrap .input-group>.custom-file .custom-file-input:focus~.custom-file-label,.bootstrap .input-group>.custom-select:focus,.bootstrap .input-group>.form-control:focus{z-index:3}.bootstrap .input-group>.custom-file .custom-file-input:focus{z-index:4}.bootstrap .input-group>.custom-select:not(:first-child),.bootstrap .input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap .input-group>.custom-file{align-items:center;display:flex}.bootstrap .input-group>.custom-file:not(:last-child) .custom-file-label,.bootstrap .input-group>.custom-file:not(:last-child) .custom-file-label:after{border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap .input-group>.custom-file:not(:first-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap .input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.bootstrap .input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.bootstrap .input-group.has-validation>.custom-select:nth-last-child(n+3),.bootstrap .input-group.has-validation>.form-control:nth-last-child(n+3),.bootstrap .input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.bootstrap .input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.bootstrap .input-group:not(.has-validation)>.custom-select:not(:last-child),.bootstrap .input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap .input-group-append,.bootstrap .input-group-prepend{display:flex}.bootstrap .input-group-append .btn,.bootstrap .input-group-prepend .btn{position:relative;z-index:2}.bootstrap .input-group-append .btn:focus,.bootstrap .input-group-prepend .btn:focus{z-index:3}.bootstrap .input-group-append .btn+.btn,.bootstrap .input-group-append .btn+.input-group-text,.bootstrap .input-group-append .input-group-text+.btn,.bootstrap .input-group-append .input-group-text+.input-group-text,.bootstrap .input-group-prepend .btn+.btn,.bootstrap .input-group-prepend .btn+.input-group-text,.bootstrap .input-group-prepend .input-group-text+.btn,.bootstrap .input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.bootstrap .input-group-prepend{margin-right:-1px}.bootstrap .input-group-append{margin-left:-1px}.bootstrap .input-group-text{align-items:center;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:flex;font-size:1rem;font-weight:400;line-height:1.5;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.bootstrap .input-group-text input[type=checkbox],.bootstrap .input-group-text input[type=radio]{margin-top:0}.bootstrap .input-group-lg>.custom-select,.bootstrap .input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.bootstrap .input-group-lg>.custom-select,.bootstrap .input-group-lg>.form-control,.bootstrap .input-group-lg>.input-group-append>.btn,.bootstrap .input-group-lg>.input-group-append>.input-group-text,.bootstrap .input-group-lg>.input-group-prepend>.btn,.bootstrap .input-group-lg>.input-group-prepend>.input-group-text{border-radius:.3rem;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.bootstrap .input-group-sm>.custom-select,.bootstrap .input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.bootstrap .input-group-sm>.custom-select,.bootstrap .input-group-sm>.form-control,.bootstrap .input-group-sm>.input-group-append>.btn,.bootstrap .input-group-sm>.input-group-append>.input-group-text,.bootstrap .input-group-sm>.input-group-prepend>.btn,.bootstrap .input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.bootstrap .input-group-lg>.custom-select,.bootstrap .input-group-sm>.custom-select{padding-right:1.75rem}.bootstrap .input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.bootstrap .input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.bootstrap .input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.bootstrap .input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.bootstrap .input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.bootstrap .input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.bootstrap .input-group>.input-group-prepend>.btn,.bootstrap .input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap .input-group>.input-group-append>.btn,.bootstrap .input-group>.input-group-append>.input-group-text,.bootstrap .input-group>.input-group-prepend:first-child>.btn:not(:first-child),.bootstrap .input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.bootstrap .input-group>.input-group-prepend:not(:first-child)>.btn,.bootstrap .input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap .custom-control{-webkit-print-color-adjust:exact;color-adjust:exact;display:block;min-height:1.5rem;padding-left:1.5rem;position:relative;z-index:1}.bootstrap .custom-control-inline{display:inline-flex;margin-right:1rem}.bootstrap .custom-control-input{height:1.25rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.bootstrap .custom-control-input:checked~.custom-control-label:before{background-color:#007bff;border-color:#007bff;color:#fff}.bootstrap .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #007bff40}.bootstrap .custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#80bdff}.bootstrap .custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#b3d7ff;border-color:#b3d7ff;color:#fff}.bootstrap .custom-control-input:disabled~.custom-control-label,.bootstrap .custom-control-input[disabled]~.custom-control-label{color:#6c757d}.bootstrap .custom-control-input:disabled~.custom-control-label:before,.bootstrap .custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.bootstrap .custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.bootstrap .custom-control-label:before{background-color:#fff;border:1px solid #adb5bd;pointer-events:none}.bootstrap .custom-control-label:after,.bootstrap .custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.25rem;width:1rem}.bootstrap .custom-control-label:after{background:50%/50% 50% no-repeat}.bootstrap .custom-checkbox .custom-control-label:before{border-radius:.25rem}.bootstrap .custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.bootstrap .custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#007bff;border-color:#007bff}.bootstrap .custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.bootstrap .custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before,.bootstrap .custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:#007bff80}.bootstrap .custom-radio .custom-control-label:before{border-radius:50%}.bootstrap .custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.bootstrap .custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:#007bff80}.bootstrap .custom-switch{padding-left:2.25rem}.bootstrap .custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.bootstrap .custom-switch .custom-control-label:after{background-color:#adb5bd;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.25rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media(prefers-reduced-motion:reduce){.bootstrap .custom-switch .custom-control-label:after{transition:none}}.bootstrap .custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.bootstrap .custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:#007bff80}.bootstrap .custom-select{-webkit-appearance:none;appearance:none;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;color:#495057;display:inline-block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.bootstrap .custom-select:focus{border-color:#80bdff;box-shadow:0 0 0 .2rem #007bff40;outline:0}.bootstrap .custom-select:focus::-ms-value{background-color:#fff;color:#495057}.bootstrap .custom-select[multiple],.bootstrap .custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.bootstrap .custom-select:disabled{background-color:#e9ecef;color:#6c757d}.bootstrap .custom-select::-ms-expand{display:none}.bootstrap .custom-select:-moz-focusring{color:#0000;text-shadow:0 0 0 #495057}.bootstrap .custom-select-sm{font-size:.875rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.bootstrap .custom-select-lg{font-size:1.25rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.bootstrap .custom-file{display:inline-block;margin-bottom:0}.bootstrap .custom-file,.bootstrap .custom-file-input{height:calc(1.5em + .75rem + 2px);position:relative;width:100%}.bootstrap .custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.bootstrap .custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem #007bff40}.bootstrap .custom-file-input:disabled~.custom-file-label,.bootstrap .custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.bootstrap .custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.bootstrap .custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.bootstrap .custom-file-label{background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;font-weight:400;height:calc(1.5em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.bootstrap .custom-file-label,.bootstrap .custom-file-label:after{color:#495057;line-height:1.5;padding:.375rem .75rem;position:absolute;right:0;top:0}.bootstrap .custom-file-label:after{background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.5em + .75rem);z-index:3}.bootstrap .custom-range{-webkit-appearance:none;appearance:none;background-color:initial;height:1.4rem;padding:0;width:100%}.bootstrap .custom-range:focus{outline:0}.bootstrap .custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #007bff40}.bootstrap .custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #007bff40}.bootstrap .custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #007bff40}.bootstrap .custom-range::-moz-focus-outer{border:0}.bootstrap .custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#007bff;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.bootstrap .custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.bootstrap .custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.bootstrap .custom-range::-webkit-slider-runnable-track{background-color:#dee2e6;border-color:#0000;border-radius:1rem;color:#0000;cursor:pointer;height:.5rem;width:100%}.bootstrap .custom-range::-moz-range-thumb{appearance:none;background-color:#007bff;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.bootstrap .custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.bootstrap .custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.bootstrap .custom-range::-moz-range-track{background-color:#dee2e6;border-color:#0000;border-radius:1rem;color:#0000;cursor:pointer;height:.5rem;width:100%}.bootstrap .custom-range::-ms-thumb{appearance:none;background-color:#007bff;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.bootstrap .custom-range::-ms-thumb{-ms-transition:none;transition:none}}.bootstrap .custom-range::-ms-thumb:active{background-color:#b3d7ff}.bootstrap .custom-range::-ms-track{background-color:initial;border-color:#0000;border-width:.5rem;color:#0000;cursor:pointer;height:.5rem;width:100%}.bootstrap .custom-range::-ms-fill-lower,.bootstrap .custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.bootstrap .custom-range::-ms-fill-upper{margin-right:15px}.bootstrap .custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.bootstrap .custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.bootstrap .custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.bootstrap .custom-range:disabled::-moz-range-track{cursor:default}.bootstrap .custom-range:disabled::-ms-thumb{background-color:#adb5bd}.bootstrap .custom-control-label:before,.bootstrap .custom-file-label,.bootstrap .custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.bootstrap .custom-control-label:before,.bootstrap .custom-file-label,.bootstrap .custom-select{transition:none}}.bootstrap .nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.bootstrap .nav-link{display:block;padding:.5rem 1rem}.bootstrap .nav-link:focus,.bootstrap .nav-link:hover{text-decoration:none}.bootstrap .nav-link.disabled{color:#6c757d;cursor:default;pointer-events:none}.bootstrap .nav-tabs{border-bottom:1px solid #dee2e6}.bootstrap .nav-tabs .nav-link{border:1px solid #0000;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.bootstrap .nav-tabs .nav-link:focus,.bootstrap .nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.bootstrap .nav-tabs .nav-link.disabled{background-color:initial;border-color:#0000;color:#6c757d}.bootstrap .nav-tabs .nav-item.show .nav-link,.bootstrap .nav-tabs .nav-link.active{background-color:#fff;border-color:#dee2e6 #dee2e6 #fff;color:#495057}.bootstrap .nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.bootstrap .nav-pills .nav-link{border-radius:.25rem}.bootstrap .nav-pills .nav-link.active,.bootstrap .nav-pills .show>.nav-link{background-color:#007bff;color:#fff}.bootstrap .nav-fill .nav-item,.bootstrap .nav-fill>.nav-link{flex:1 1 auto;text-align:center}.bootstrap .nav-justified .nav-item,.bootstrap .nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.bootstrap .tab-content>.tab-pane{display:none}.bootstrap .tab-content>.active{display:block}.bootstrap .navbar{padding:.5rem 1rem;position:relative}.bootstrap .navbar,.bootstrap .navbar .container,.bootstrap .navbar .container-fluid,.bootstrap .navbar .container-lg,.bootstrap .navbar .container-md,.bootstrap .navbar .container-sm,.bootstrap .navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.bootstrap .navbar-brand{display:inline-block;font-size:1.25rem;line-height:inherit;margin-right:1rem;padding-bottom:.3125rem;padding-top:.3125rem;white-space:nowrap}.bootstrap .navbar-brand:focus,.bootstrap .navbar-brand:hover{text-decoration:none}.bootstrap .navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.bootstrap .navbar-nav .nav-link{padding-left:0;padding-right:0}.bootstrap .navbar-nav .dropdown-menu{float:none;position:static}.bootstrap .navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.bootstrap .navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.bootstrap .navbar-toggler{background-color:initial;border:1px solid #0000;border-radius:.25rem;font-size:1.25rem;line-height:1;padding:.25rem .75rem}.bootstrap .navbar-toggler:focus,.bootstrap .navbar-toggler:hover{text-decoration:none}.bootstrap .navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.bootstrap .navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width:575.98px){.bootstrap .navbar-expand-sm>.container,.bootstrap .navbar-expand-sm>.container-fluid,.bootstrap .navbar-expand-sm>.container-lg,.bootstrap .navbar-expand-sm>.container-md,.bootstrap .navbar-expand-sm>.container-sm,.bootstrap .navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media(min-width:576px){.bootstrap .navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.bootstrap .navbar-expand-sm .navbar-nav{flex-direction:row}.bootstrap .navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.bootstrap .navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap .navbar-expand-sm>.container,.bootstrap .navbar-expand-sm>.container-fluid,.bootstrap .navbar-expand-sm>.container-lg,.bootstrap .navbar-expand-sm>.container-md,.bootstrap .navbar-expand-sm>.container-sm,.bootstrap .navbar-expand-sm>.container-xl{flex-wrap:nowrap}.bootstrap .navbar-expand-sm .navbar-nav-scroll{overflow:visible}.bootstrap .navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap .navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.bootstrap .navbar-expand-md>.container,.bootstrap .navbar-expand-md>.container-fluid,.bootstrap .navbar-expand-md>.container-lg,.bootstrap .navbar-expand-md>.container-md,.bootstrap .navbar-expand-md>.container-sm,.bootstrap .navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media(min-width:768px){.bootstrap .navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.bootstrap .navbar-expand-md .navbar-nav{flex-direction:row}.bootstrap .navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.bootstrap .navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap .navbar-expand-md>.container,.bootstrap .navbar-expand-md>.container-fluid,.bootstrap .navbar-expand-md>.container-lg,.bootstrap .navbar-expand-md>.container-md,.bootstrap .navbar-expand-md>.container-sm,.bootstrap .navbar-expand-md>.container-xl{flex-wrap:nowrap}.bootstrap .navbar-expand-md .navbar-nav-scroll{overflow:visible}.bootstrap .navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap .navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.bootstrap .navbar-expand-lg>.container,.bootstrap .navbar-expand-lg>.container-fluid,.bootstrap .navbar-expand-lg>.container-lg,.bootstrap .navbar-expand-lg>.container-md,.bootstrap .navbar-expand-lg>.container-sm,.bootstrap .navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media(min-width:992px){.bootstrap .navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.bootstrap .navbar-expand-lg .navbar-nav{flex-direction:row}.bootstrap .navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.bootstrap .navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap .navbar-expand-lg>.container,.bootstrap .navbar-expand-lg>.container-fluid,.bootstrap .navbar-expand-lg>.container-lg,.bootstrap .navbar-expand-lg>.container-md,.bootstrap .navbar-expand-lg>.container-sm,.bootstrap .navbar-expand-lg>.container-xl{flex-wrap:nowrap}.bootstrap .navbar-expand-lg .navbar-nav-scroll{overflow:visible}.bootstrap .navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap .navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.bootstrap .navbar-expand-xl>.container,.bootstrap .navbar-expand-xl>.container-fluid,.bootstrap .navbar-expand-xl>.container-lg,.bootstrap .navbar-expand-xl>.container-md,.bootstrap .navbar-expand-xl>.container-sm,.bootstrap .navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media(min-width:1200px){.bootstrap .navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.bootstrap .navbar-expand-xl .navbar-nav{flex-direction:row}.bootstrap .navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.bootstrap .navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap .navbar-expand-xl>.container,.bootstrap .navbar-expand-xl>.container-fluid,.bootstrap .navbar-expand-xl>.container-lg,.bootstrap .navbar-expand-xl>.container-md,.bootstrap .navbar-expand-xl>.container-sm,.bootstrap .navbar-expand-xl>.container-xl{flex-wrap:nowrap}.bootstrap .navbar-expand-xl .navbar-nav-scroll{overflow:visible}.bootstrap .navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap .navbar-expand-xl .navbar-toggler{display:none}}.bootstrap .navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.bootstrap .navbar-expand>.container,.bootstrap .navbar-expand>.container-fluid,.bootstrap .navbar-expand>.container-lg,.bootstrap .navbar-expand>.container-md,.bootstrap .navbar-expand>.container-sm,.bootstrap .navbar-expand>.container-xl{padding-left:0;padding-right:0}.bootstrap .navbar-expand .navbar-nav{flex-direction:row}.bootstrap .navbar-expand .navbar-nav .dropdown-menu{position:absolute}.bootstrap .navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap .navbar-expand>.container,.bootstrap .navbar-expand>.container-fluid,.bootstrap .navbar-expand>.container-lg,.bootstrap .navbar-expand>.container-md,.bootstrap .navbar-expand>.container-sm,.bootstrap .navbar-expand>.container-xl{flex-wrap:nowrap}.bootstrap .navbar-expand .navbar-nav-scroll{overflow:visible}.bootstrap .navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap .navbar-expand .navbar-toggler{display:none}.bootstrap .navbar-light .navbar-brand,.bootstrap .navbar-light .navbar-brand:focus,.bootstrap .navbar-light .navbar-brand:hover,.bootstrap .navbar-themed .navbar-brand,.bootstrap .navbar-themed .navbar-brand:focus,.bootstrap .navbar-themed .navbar-brand:hover{color:#000000e6}.bootstrap .navbar-light .navbar-nav .nav-link,.bootstrap .navbar-themed .navbar-nav .nav-link{color:#00000080}.bootstrap .navbar-light .navbar-nav .nav-link:focus,.bootstrap .navbar-light .navbar-nav .nav-link:hover,.bootstrap .navbar-themed .navbar-nav .nav-link:focus,.bootstrap .navbar-themed .navbar-nav .nav-link:hover{color:#000000b3}.bootstrap .navbar-light .navbar-nav .nav-link.disabled,.bootstrap .navbar-themed .navbar-nav .nav-link.disabled{color:#0000004d}.bootstrap .navbar-light .navbar-nav .active>.nav-link,.bootstrap .navbar-light .navbar-nav .nav-link.active,.bootstrap .navbar-light .navbar-nav .nav-link.show,.bootstrap .navbar-light .navbar-nav .show>.nav-link,.bootstrap .navbar-themed .navbar-nav .active>.nav-link,.bootstrap .navbar-themed .navbar-nav .nav-link.active,.bootstrap .navbar-themed .navbar-nav .nav-link.show,.bootstrap .navbar-themed .navbar-nav .show>.nav-link{color:#000000e6}.bootstrap .navbar-light .navbar-toggler,.bootstrap .navbar-themed .navbar-toggler{border-color:#0000001a;color:#00000080}.bootstrap .navbar-light .navbar-toggler-icon,.bootstrap .navbar-themed .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.bootstrap .navbar-light .navbar-text,.bootstrap .navbar-themed .navbar-text{color:#00000080}.bootstrap .navbar-light .navbar-text a,.bootstrap .navbar-light .navbar-text a:focus,.bootstrap .navbar-light .navbar-text a:hover,.bootstrap .navbar-themed .navbar-text a,.bootstrap .navbar-themed .navbar-text a:focus,.bootstrap .navbar-themed .navbar-text a:hover{color:#000000e6}.bootstrap .navbar-dark .navbar-brand,.bootstrap .navbar-dark .navbar-brand:focus,.bootstrap .navbar-dark .navbar-brand:hover{color:#fff}.bootstrap .navbar-dark .navbar-nav .nav-link{color:#ffffff80}.bootstrap .navbar-dark .navbar-nav .nav-link:focus,.bootstrap .navbar-dark .navbar-nav .nav-link:hover{color:#ffffffbf}.bootstrap .navbar-dark .navbar-nav .nav-link.disabled{color:#ffffff40}.bootstrap .navbar-dark .navbar-nav .active>.nav-link,.bootstrap .navbar-dark .navbar-nav .nav-link.active,.bootstrap .navbar-dark .navbar-nav .nav-link.show,.bootstrap .navbar-dark .navbar-nav .show>.nav-link{color:#fff}.bootstrap .navbar-dark .navbar-toggler{border-color:#ffffff1a;color:#ffffff80}.bootstrap .navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.bootstrap .navbar-dark .navbar-text{color:#ffffff80}.bootstrap .navbar-dark .navbar-text a,.bootstrap .navbar-dark .navbar-text a:focus,.bootstrap .navbar-dark .navbar-text a:hover{color:#fff}.bootstrap .card{word-wrap:break-word;background-clip:initial;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem;display:flex;flex-direction:column;min-width:0;position:relative}.bootstrap .card>hr{margin-left:0;margin-right:0}.bootstrap .card>.list-group{border-bottom:inherit;border-top:inherit}.bootstrap .card>.list-group:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);border-top-width:0}.bootstrap .card>.list-group:last-child{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px);border-bottom-width:0}.bootstrap .card>.card-header+.list-group,.bootstrap .card>.list-group+.card-footer{border-top:0}.bootstrap .card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.bootstrap .card-title{margin-bottom:.75rem}.bootstrap .card-subtitle{margin-bottom:0;margin-top:-.375rem}.bootstrap .card-text:last-child{margin-bottom:0}.bootstrap .card-link:hover{text-decoration:none}.bootstrap .card-link+.card-link{margin-left:1.25rem}.bootstrap .card-header{background-color:#00000008;border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.bootstrap .card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.bootstrap .card-footer{background-color:#00000008;border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.bootstrap .card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.bootstrap .card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.bootstrap .card-header-pills,.bootstrap .card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.bootstrap .card-img-overlay{border-radius:calc(.25rem - 1px);bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.bootstrap .card-img,.bootstrap .card-img-bottom,.bootstrap .card-img-top{flex-shrink:0;width:100%}.bootstrap .card-img,.bootstrap .card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.bootstrap .card-img,.bootstrap .card-img-bottom{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.bootstrap .card-deck .card{margin-bottom:15px}@media(min-width:576px){.bootstrap .card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.bootstrap .card-deck .card{flex:1 0;margin-bottom:0;margin-left:15px;margin-right:15px}}.bootstrap .card-group>.card{margin-bottom:15px}@media(min-width:576px){.bootstrap .card-group{display:flex;flex-flow:row wrap}.bootstrap .card-group>.card{flex:1 0;margin-bottom:0}.bootstrap .card-group>.card+.card{border-left:0;margin-left:0}.bootstrap .card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap .card-group>.card:not(:last-child) .card-header,.bootstrap .card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.bootstrap .card-group>.card:not(:last-child) .card-footer,.bootstrap .card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.bootstrap .card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap .card-group>.card:not(:first-child) .card-header,.bootstrap .card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.bootstrap .card-group>.card:not(:first-child) .card-footer,.bootstrap .card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.bootstrap .card-columns .card{margin-bottom:.75rem}@media(min-width:576px){.bootstrap .card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.bootstrap .card-columns .card{display:inline-block;width:100%}}.bootstrap .accordion{overflow-anchor:none}.bootstrap .accordion>.card{overflow:hidden}.bootstrap .accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.bootstrap .accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.bootstrap .accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.bootstrap .breadcrumb{background-color:#e9ecef;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.bootstrap .breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.bootstrap .breadcrumb-item+.breadcrumb-item:before{color:#6c757d;content:"/";float:left;padding-right:.5rem}.bootstrap .breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.bootstrap .breadcrumb-item.active{color:#6c757d}.bootstrap .pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.bootstrap .page-link{background-color:#fff;border:1px solid #dee2e6;color:#007bff;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.bootstrap .page-link:hover{background-color:#e9ecef;border-color:#dee2e6;color:#0056b3;text-decoration:none;z-index:2}.bootstrap .page-link:focus{box-shadow:0 0 0 .2rem #007bff40;outline:0;z-index:3}.bootstrap .page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.bootstrap .page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.bootstrap .page-item.active .page-link{background-color:#007bff;border-color:#007bff;color:#fff;z-index:3}.bootstrap .page-item.disabled .page-link{background-color:#fff;border-color:#dee2e6;color:#6c757d;cursor:auto;pointer-events:none}.bootstrap .pagination-lg .page-link{font-size:1.25rem;line-height:1.5;padding:.75rem 1.5rem}.bootstrap .pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.bootstrap .pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.bootstrap .pagination-sm .page-link{font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.bootstrap .pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.bootstrap .pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.bootstrap .badge{border-radius:.25rem;display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:initial;white-space:nowrap}@media(prefers-reduced-motion:reduce){.bootstrap .badge{transition:none}}a.bootstrap .badge:focus,a.bootstrap .badge:hover{text-decoration:none}.bootstrap .badge:empty{display:none}.bootstrap .btn .badge{position:relative;top:-1px}.bootstrap .badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.bootstrap .badge-primary{background-color:#007bff;color:#fff}a.bootstrap .badge-primary:focus,a.bootstrap .badge-primary:hover{background-color:#0062cc;color:#fff}a.bootstrap .badge-primary.focus,a.bootstrap .badge-primary:focus{box-shadow:0 0 0 .2rem #007bff80;outline:0}.bootstrap .badge-secondary{background-color:#6c757d;color:#fff}a.bootstrap .badge-secondary:focus,a.bootstrap .badge-secondary:hover{background-color:#545b62;color:#fff}a.bootstrap .badge-secondary.focus,a.bootstrap .badge-secondary:focus{box-shadow:0 0 0 .2rem #6c757d80;outline:0}.bootstrap .badge-success{background-color:#28a745;color:#fff}a.bootstrap .badge-success:focus,a.bootstrap .badge-success:hover{background-color:#1e7e34;color:#fff}a.bootstrap .badge-success.focus,a.bootstrap .badge-success:focus{box-shadow:0 0 0 .2rem #28a74580;outline:0}.bootstrap .badge-info{background-color:#17a2b8;color:#fff}a.bootstrap .badge-info:focus,a.bootstrap .badge-info:hover{background-color:#117a8b;color:#fff}a.bootstrap .badge-info.focus,a.bootstrap .badge-info:focus{box-shadow:0 0 0 .2rem #17a2b880;outline:0}.bootstrap .badge-warning{background-color:#ffc107;color:#212529}a.bootstrap .badge-warning:focus,a.bootstrap .badge-warning:hover{background-color:#d39e00;color:#212529}a.bootstrap .badge-warning.focus,a.bootstrap .badge-warning:focus{box-shadow:0 0 0 .2rem #ffc10780;outline:0}.bootstrap .badge-danger{background-color:#dc3545;color:#fff}a.bootstrap .badge-danger:focus,a.bootstrap .badge-danger:hover{background-color:#bd2130;color:#fff}a.bootstrap .badge-danger.focus,a.bootstrap .badge-danger:focus{box-shadow:0 0 0 .2rem #dc354580;outline:0}.bootstrap .badge-light{background-color:#f8f9fa;color:#212529}a.bootstrap .badge-light:focus,a.bootstrap .badge-light:hover{background-color:#dae0e5;color:#212529}a.bootstrap .badge-light.focus,a.bootstrap .badge-light:focus{box-shadow:0 0 0 .2rem #f8f9fa80;outline:0}.bootstrap .badge-dark{background-color:#343a40;color:#fff}a.bootstrap .badge-dark:focus,a.bootstrap .badge-dark:hover{background-color:#1d2124;color:#fff}a.bootstrap .badge-dark.focus,a.bootstrap .badge-dark:focus{box-shadow:0 0 0 .2rem #343a4080;outline:0}.bootstrap .jumbotron{background-color:#e9ecef;border-radius:.3rem;margin-bottom:2rem;padding:2rem 1rem}@media(min-width:576px){.bootstrap .jumbotron{padding:4rem 2rem}}.bootstrap .jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.bootstrap .alert{border:1px solid #0000;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.bootstrap .alert-heading{color:inherit}.bootstrap .alert-link{font-weight:700}.bootstrap .alert-dismissible{padding-right:4rem}.bootstrap .alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.bootstrap .alert-primary{background-color:#cce5ff;border-color:#b8daff;color:#004085}.bootstrap .alert-primary hr{border-top-color:#9fcdff}.bootstrap .alert-primary .alert-link{color:#002752}.bootstrap .alert-secondary{background-color:#e2e3e5;border-color:#d6d8db;color:#383d41}.bootstrap .alert-secondary hr{border-top-color:#c8cbcf}.bootstrap .alert-secondary .alert-link{color:#202326}.bootstrap .alert-success{background-color:#d4edda;border-color:#c3e6cb;color:#155724}.bootstrap .alert-success hr{border-top-color:#b1dfbb}.bootstrap .alert-success .alert-link{color:#0b2e13}.bootstrap .alert-info{background-color:#d1ecf1;border-color:#bee5eb;color:#0c5460}.bootstrap .alert-info hr{border-top-color:#abdde5}.bootstrap .alert-info .alert-link{color:#062c33}.bootstrap .alert-warning{background-color:#fff3cd;border-color:#ffeeba;color:#856404}.bootstrap .alert-warning hr{border-top-color:#ffe8a1}.bootstrap .alert-warning .alert-link{color:#533f03}.bootstrap .alert-danger{background-color:#f8d7da;border-color:#f5c6cb;color:#721c24}.bootstrap .alert-danger hr{border-top-color:#f1b0b7}.bootstrap .alert-danger .alert-link{color:#491217}.bootstrap .alert-light{background-color:#fefefe;border-color:#fdfdfe;color:#818182}.bootstrap .alert-light hr{border-top-color:#ececf6}.bootstrap .alert-light .alert-link{color:#686868}.bootstrap .alert-dark{background-color:#d6d8d9;border-color:#c6c8ca;color:#1b1e21}.bootstrap .alert-dark hr{border-top-color:#b9bbbe}.bootstrap .alert-dark .alert-link{color:#040505}.bootstrap .progress{background-color:#e9ecef;border-radius:.25rem;display:flex;font-size:.75rem;height:1rem;line-height:0;overflow:hidden}.bootstrap .progress-bar{background-color:#007bff;color:#fff;display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-align:center;transition:width .6s ease;white-space:nowrap}@media(prefers-reduced-motion:reduce){.bootstrap .progress-bar{transition:none}}.bootstrap .progress-bar-striped{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-size:1rem 1rem}.bootstrap .progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media(prefers-reduced-motion:reduce){.bootstrap .progress-bar-animated{animation:none}}.bootstrap .media{align-items:flex-start;display:flex}.bootstrap .media-body{flex:1 1}.bootstrap .list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.bootstrap .list-group-item-action{color:#495057;text-align:inherit;width:100%}.bootstrap .list-group-item-action:focus,.bootstrap .list-group-item-action:hover{background-color:#f8f9fa;color:#495057;text-decoration:none;z-index:1}.bootstrap .list-group-item-action:active{background-color:#e9ecef;color:#212529}.bootstrap .list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.bootstrap .list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.bootstrap .list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bootstrap .list-group-item.disabled,.bootstrap .list-group-item:disabled{background-color:#fff;color:#6c757d;pointer-events:none}.bootstrap .list-group-item.active{background-color:#007bff;border-color:#007bff;color:#fff;z-index:2}.bootstrap .list-group-item+.bootstrap .list-group-item{border-top-width:0}.bootstrap .list-group-item+.bootstrap .list-group-item.active{border-top-width:1px;margin-top:-1px}.bootstrap .list-group-horizontal{flex-direction:row}.bootstrap .list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap .list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap .list-group-horizontal>.list-group-item.active{margin-top:0}.bootstrap .list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap .list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media(min-width:576px){.bootstrap .list-group-horizontal-sm{flex-direction:row}.bootstrap .list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap .list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap .list-group-horizontal-sm>.list-group-item.active{margin-top:0}.bootstrap .list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap .list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:768px){.bootstrap .list-group-horizontal-md{flex-direction:row}.bootstrap .list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap .list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap .list-group-horizontal-md>.list-group-item.active{margin-top:0}.bootstrap .list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap .list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:992px){.bootstrap .list-group-horizontal-lg{flex-direction:row}.bootstrap .list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap .list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap .list-group-horizontal-lg>.list-group-item.active{margin-top:0}.bootstrap .list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap .list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:1200px){.bootstrap .list-group-horizontal-xl{flex-direction:row}.bootstrap .list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap .list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap .list-group-horizontal-xl>.list-group-item.active{margin-top:0}.bootstrap .list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap .list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.bootstrap .list-group-flush{border-radius:0}.bootstrap .list-group-flush>.list-group-item{border-width:0 0 1px}.bootstrap .list-group-flush>.list-group-item:last-child{border-bottom-width:0}.bootstrap .list-group-item-primary{background-color:#b8daff;color:#004085}.bootstrap .list-group-item-primary.list-group-item-action:focus,.bootstrap .list-group-item-primary.list-group-item-action:hover{background-color:#9fcdff;color:#004085}.bootstrap .list-group-item-primary.list-group-item-action.active{background-color:#004085;border-color:#004085;color:#fff}.bootstrap .list-group-item-secondary{background-color:#d6d8db;color:#383d41}.bootstrap .list-group-item-secondary.list-group-item-action:focus,.bootstrap .list-group-item-secondary.list-group-item-action:hover{background-color:#c8cbcf;color:#383d41}.bootstrap .list-group-item-secondary.list-group-item-action.active{background-color:#383d41;border-color:#383d41;color:#fff}.bootstrap .list-group-item-success{background-color:#c3e6cb;color:#155724}.bootstrap .list-group-item-success.list-group-item-action:focus,.bootstrap .list-group-item-success.list-group-item-action:hover{background-color:#b1dfbb;color:#155724}.bootstrap .list-group-item-success.list-group-item-action.active{background-color:#155724;border-color:#155724;color:#fff}.bootstrap .list-group-item-info{background-color:#bee5eb;color:#0c5460}.bootstrap .list-group-item-info.list-group-item-action:focus,.bootstrap .list-group-item-info.list-group-item-action:hover{background-color:#abdde5;color:#0c5460}.bootstrap .list-group-item-info.list-group-item-action.active{background-color:#0c5460;border-color:#0c5460;color:#fff}.bootstrap .list-group-item-warning{background-color:#ffeeba;color:#856404}.bootstrap .list-group-item-warning.list-group-item-action:focus,.bootstrap .list-group-item-warning.list-group-item-action:hover{background-color:#ffe8a1;color:#856404}.bootstrap .list-group-item-warning.list-group-item-action.active{background-color:#856404;border-color:#856404;color:#fff}.bootstrap .list-group-item-danger{background-color:#f5c6cb;color:#721c24}.bootstrap .list-group-item-danger.list-group-item-action:focus,.bootstrap .list-group-item-danger.list-group-item-action:hover{background-color:#f1b0b7;color:#721c24}.bootstrap .list-group-item-danger.list-group-item-action.active{background-color:#721c24;border-color:#721c24;color:#fff}.bootstrap .list-group-item-light{background-color:#fdfdfe;color:#818182}.bootstrap .list-group-item-light.list-group-item-action:focus,.bootstrap .list-group-item-light.list-group-item-action:hover{background-color:#ececf6;color:#818182}.bootstrap .list-group-item-light.list-group-item-action.active{background-color:#818182;border-color:#818182;color:#fff}.bootstrap .list-group-item-dark{background-color:#c6c8ca;color:#1b1e21}.bootstrap .list-group-item-dark.list-group-item-action:focus,.bootstrap .list-group-item-dark.list-group-item-action:hover{background-color:#b9bbbe;color:#1b1e21}.bootstrap .list-group-item-dark.list-group-item-action.active{background-color:#1b1e21;border-color:#1b1e21;color:#fff}.bootstrap .close{color:#000;float:right;font-size:1.5rem;font-weight:700;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.bootstrap .close:hover{color:#000;text-decoration:none}.bootstrap .close:not(:disabled):not(.disabled):focus,.bootstrap .close:not(:disabled):not(.disabled):hover{opacity:.75}.bootstrap button.close{background-color:initial;border:0;padding:0}.bootstrap a.close.disabled{pointer-events:none}.bootstrap .toast{background-clip:padding-box;background-color:#ffffffd9;border:1px solid #0000001a;border-radius:.25rem;box-shadow:0 .25rem .75rem #0000001a;flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.bootstrap .toast:not(:last-child){margin-bottom:.75rem}.bootstrap .toast.showing{opacity:1}.bootstrap .toast.show{display:block;opacity:1}.bootstrap .toast.hide{display:none}.bootstrap .toast-header{align-items:center;background-clip:padding-box;background-color:#ffffffd9;border-bottom:1px solid #0000000d;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#6c757d;display:flex;padding:.25rem .75rem}.bootstrap .toast-body{padding:.75rem}.bootstrap .modal-open{overflow:hidden}.bootstrap .modal-open .modal{overflow-x:hidden;overflow-y:auto}.bootstrap .modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.bootstrap .modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .bootstrap .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media(prefers-reduced-motion:reduce){.modal.fade .bootstrap .modal-dialog{transition:none}}.modal.show .bootstrap .modal-dialog{transform:none}.modal.modal-static .bootstrap .modal-dialog{transform:scale(1.02)}.bootstrap .modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.bootstrap .modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.bootstrap .modal-dialog-scrollable .modal-footer,.bootstrap .modal-dialog-scrollable .modal-header{flex-shrink:0}.bootstrap .modal-dialog-scrollable .modal-body{overflow-y:auto}.bootstrap .modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.bootstrap .modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:min-content}.bootstrap .modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.bootstrap .modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.bootstrap .modal-dialog-centered.modal-dialog-scrollable:before{content:none}.bootstrap .modal-content{background-clip:padding-box;background-color:#fff;border:1px solid #0003;border-radius:.3rem;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.bootstrap .modal-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.bootstrap .modal-backdrop.fade{opacity:0}.bootstrap .modal-backdrop.show{opacity:.5}.bootstrap .modal-header{align-items:flex-start;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);display:flex;justify-content:space-between;padding:1rem}.bootstrap .modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.bootstrap .modal-title{line-height:1.5;margin-bottom:0}.bootstrap .modal-body{flex:1 1 auto;padding:1rem;position:relative}.bootstrap .modal-footer{align-items:center;border-bottom-left-radius:calc(.3rem - 1px);border-bottom-right-radius:calc(.3rem - 1px);border-top:1px solid #dee2e6;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.bootstrap .modal-footer>*{margin:.25rem}.bootstrap .modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media(min-width:576px){.bootstrap .modal-dialog{margin:1.75rem auto;max-width:500px}.bootstrap .modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.bootstrap .modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.bootstrap .modal-dialog-centered{min-height:calc(100% - 3.5rem)}.bootstrap .modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:min-content}.bootstrap .modal-sm{max-width:300px}}@media(min-width:992px){.bootstrap .modal-lg,.bootstrap .modal-xl{max-width:800px}}@media(min-width:1200px){.bootstrap .modal-xl{max-width:1140px}}.bootstrap .tooltip{word-wrap:break-word;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.875rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.bootstrap .tooltip.show{opacity:.9}.bootstrap .tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.bootstrap .tooltip .arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.bootstrap .bs-tooltip-auto[x-placement^=top],.bootstrap .bs-tooltip-top{padding:.4rem 0}.bootstrap .bs-tooltip-auto[x-placement^=top] .arrow,.bootstrap .bs-tooltip-top .arrow{bottom:0}.bootstrap .bs-tooltip-auto[x-placement^=top] .arrow:before,.bootstrap .bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bootstrap .bs-tooltip-auto[x-placement^=right],.bootstrap .bs-tooltip-right{padding:0 .4rem}.bootstrap .bs-tooltip-auto[x-placement^=right] .arrow,.bootstrap .bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bootstrap .bs-tooltip-auto[x-placement^=right] .arrow:before,.bootstrap .bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bootstrap .bs-tooltip-auto[x-placement^=bottom],.bootstrap .bs-tooltip-bottom{padding:.4rem 0}.bootstrap .bs-tooltip-auto[x-placement^=bottom] .arrow,.bootstrap .bs-tooltip-bottom .arrow{top:0}.bootstrap .bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bootstrap .bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bootstrap .bs-tooltip-auto[x-placement^=left],.bootstrap .bs-tooltip-left{padding:0 .4rem}.bootstrap .bs-tooltip-auto[x-placement^=left] .arrow,.bootstrap .bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bootstrap .bs-tooltip-auto[x-placement^=left] .arrow:before,.bootstrap .bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.bootstrap .tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.bootstrap .popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid #0003;border-radius:.3rem;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:276px;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.bootstrap .popover .arrow{display:block;height:.5rem;margin:0 .3rem;position:absolute;width:1rem}.bootstrap .popover .arrow:after,.bootstrap .popover .arrow:before{border-color:#0000;border-style:solid;content:"";display:block;position:absolute}.bootstrap .bs-popover-auto[x-placement^=top],.bootstrap .bs-popover-top{margin-bottom:.5rem}.bootstrap .bs-popover-auto[x-placement^=top]>.arrow,.bootstrap .bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bootstrap .bs-popover-auto[x-placement^=top]>.arrow:before,.bootstrap .bs-popover-top>.arrow:before{border-top-color:#00000040;border-width:.5rem .5rem 0;bottom:0}.bootstrap .bs-popover-auto[x-placement^=top]>.arrow:after,.bootstrap .bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bootstrap .bs-popover-auto[x-placement^=right],.bootstrap .bs-popover-right{margin-left:.5rem}.bootstrap .bs-popover-auto[x-placement^=right]>.arrow,.bootstrap .bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:.3rem 0;width:.5rem}.bootstrap .bs-popover-auto[x-placement^=right]>.arrow:before,.bootstrap .bs-popover-right>.arrow:before{border-right-color:#00000040;border-width:.5rem .5rem .5rem 0;left:0}.bootstrap .bs-popover-auto[x-placement^=right]>.arrow:after,.bootstrap .bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bootstrap .bs-popover-auto[x-placement^=bottom],.bootstrap .bs-popover-bottom{margin-top:.5rem}.bootstrap .bs-popover-auto[x-placement^=bottom]>.arrow,.bootstrap .bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bootstrap .bs-popover-auto[x-placement^=bottom]>.arrow:before,.bootstrap .bs-popover-bottom>.arrow:before{border-bottom-color:#00000040;border-width:0 .5rem .5rem;top:0}.bootstrap .bs-popover-auto[x-placement^=bottom]>.arrow:after,.bootstrap .bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bootstrap .bs-popover-auto[x-placement^=bottom] .popover-header:before,.bootstrap .bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bootstrap .bs-popover-auto[x-placement^=left],.bootstrap .bs-popover-left{margin-right:.5rem}.bootstrap .bs-popover-auto[x-placement^=left]>.arrow,.bootstrap .bs-popover-left>.arrow{height:1rem;margin:.3rem 0;right:calc(-.5rem - 1px);width:.5rem}.bootstrap .bs-popover-auto[x-placement^=left]>.arrow:before,.bootstrap .bs-popover-left>.arrow:before{border-left-color:#00000040;border-width:.5rem 0 .5rem .5rem;right:0}.bootstrap .bs-popover-auto[x-placement^=left]>.arrow:after,.bootstrap .bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.bootstrap .popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);font-size:1rem;margin-bottom:0;padding:.5rem .75rem}.bootstrap .popover-header:empty{display:none}.bootstrap .popover-body{color:#212529;padding:.5rem .75rem}.bootstrap .carousel{position:relative}.bootstrap .carousel.pointer-event{touch-action:pan-y}.bootstrap .carousel-inner{overflow:hidden;position:relative;width:100%}.bootstrap .carousel-inner:after{clear:both;content:"";display:block}.bootstrap .carousel-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.bootstrap .carousel-item{transition:none}}.bootstrap .carousel-item-next,.bootstrap .carousel-item-prev,.bootstrap .carousel-item.active{display:block}.bootstrap .active.carousel-item-right,.bootstrap .carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.bootstrap .active.carousel-item-left,.bootstrap .carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.bootstrap .carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.bootstrap .carousel-fade .carousel-item-next.carousel-item-left,.bootstrap .carousel-fade .carousel-item-prev.carousel-item-right,.bootstrap .carousel-fade .carousel-item.active{opacity:1;z-index:1}.bootstrap .carousel-fade .active.carousel-item-left,.bootstrap .carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media(prefers-reduced-motion:reduce){.bootstrap .carousel-fade .active.carousel-item-left,.bootstrap .carousel-fade .active.carousel-item-right{transition:none}}.bootstrap .carousel-control-next,.bootstrap .carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media(prefers-reduced-motion:reduce){.bootstrap .carousel-control-next,.bootstrap .carousel-control-prev{transition:none}}.bootstrap .carousel-control-next:focus,.bootstrap .carousel-control-next:hover,.bootstrap .carousel-control-prev:focus,.bootstrap .carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.bootstrap .carousel-control-prev{left:0}.bootstrap .carousel-control-next{right:0}.bootstrap .carousel-control-next-icon,.bootstrap .carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.bootstrap .carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.bootstrap .carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.bootstrap .carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.bootstrap .carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid #0000;border-top:10px solid #0000;box-sizing:initial;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media(prefers-reduced-motion:reduce){.bootstrap .carousel-indicators li{transition:none}}.bootstrap .carousel-indicators .active{opacity:1}.bootstrap .carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}.bootstrap .spinner-border{animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid #0000;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.bootstrap .spinner-border-sm{border-width:.2em;height:1rem;width:1rem}.bootstrap .spinner-grow{animation:spinner-grow .75s linear infinite;background-color:currentColor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.bootstrap .spinner-grow-sm{height:1rem;width:1rem}@media(prefers-reduced-motion:reduce){.bootstrap .spinner-border,.bootstrap .spinner-grow{animation-duration:1.5s}}.bootstrap .align-baseline{vertical-align:initial!important}.bootstrap .align-top{vertical-align:top!important}.bootstrap .align-middle{vertical-align:middle!important}.bootstrap .align-bottom{vertical-align:bottom!important}.bootstrap .align-text-bottom{vertical-align:text-bottom!important}.bootstrap .align-text-top{vertical-align:text-top!important}.bootstrap .bg-primary{background-color:#007bff!important}.bootstrap a.bg-primary:focus,.bootstrap a.bg-primary:hover,.bootstrap button.bg-primary:focus,.bootstrap button.bg-primary:hover{background-color:#0062cc!important}.bootstrap .bg-secondary{background-color:#6c757d!important}.bootstrap a.bg-secondary:focus,.bootstrap a.bg-secondary:hover,.bootstrap button.bg-secondary:focus,.bootstrap button.bg-secondary:hover{background-color:#545b62!important}.bootstrap .bg-success{background-color:#28a745!important}.bootstrap a.bg-success:focus,.bootstrap a.bg-success:hover,.bootstrap button.bg-success:focus,.bootstrap button.bg-success:hover{background-color:#1e7e34!important}.bootstrap .bg-info{background-color:#17a2b8!important}.bootstrap a.bg-info:focus,.bootstrap a.bg-info:hover,.bootstrap button.bg-info:focus,.bootstrap button.bg-info:hover{background-color:#117a8b!important}.bootstrap .bg-warning{background-color:#ffc107!important}.bootstrap a.bg-warning:focus,.bootstrap a.bg-warning:hover,.bootstrap button.bg-warning:focus,.bootstrap button.bg-warning:hover{background-color:#d39e00!important}.bootstrap .bg-danger{background-color:#dc3545!important}.bootstrap a.bg-danger:focus,.bootstrap a.bg-danger:hover,.bootstrap button.bg-danger:focus,.bootstrap button.bg-danger:hover{background-color:#bd2130!important}.bootstrap .bg-light,.bootstrap .navbar-themed{background-color:#f8f9fa!important}.bootstrap a.bg-light:focus,.bootstrap a.bg-light:hover,.bootstrap a.navbar-themed:focus,.bootstrap a.navbar-themed:hover,.bootstrap button.bg-light:focus,.bootstrap button.bg-light:hover,.bootstrap button.navbar-themed:focus,.bootstrap button.navbar-themed:hover{background-color:#dae0e5!important}.bootstrap .bg-dark{background-color:#343a40!important}.bootstrap a.bg-dark:focus,.bootstrap a.bg-dark:hover,.bootstrap button.bg-dark:focus,.bootstrap button.bg-dark:hover{background-color:#1d2124!important}.bootstrap .bg-white{background-color:#fff!important}.bootstrap .bg-transparent{background-color:initial!important}.bootstrap .border{border:1px solid #dee2e6!important}.bootstrap .border-top{border-top:1px solid #dee2e6!important}.bootstrap .border-right{border-right:1px solid #dee2e6!important}.bootstrap .border-bottom{border-bottom:1px solid #dee2e6!important}.bootstrap .border-left{border-left:1px solid #dee2e6!important}.bootstrap .border-0{border:0!important}.bootstrap .border-top-0{border-top:0!important}.bootstrap .border-right-0{border-right:0!important}.bootstrap .border-bottom-0{border-bottom:0!important}.bootstrap .border-left-0{border-left:0!important}.bootstrap .border-primary{border-color:#007bff!important}.bootstrap .border-secondary{border-color:#6c757d!important}.bootstrap .border-success{border-color:#28a745!important}.bootstrap .border-info{border-color:#17a2b8!important}.bootstrap .border-warning{border-color:#ffc107!important}.bootstrap .border-danger{border-color:#dc3545!important}.bootstrap .border-light{border-color:#f8f9fa!important}.bootstrap .border-dark{border-color:#343a40!important}.bootstrap .border-white{border-color:#fff!important}.bootstrap .rounded-sm{border-radius:.2rem!important}.bootstrap .rounded{border-radius:.25rem!important}.bootstrap .rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.bootstrap .rounded-right{border-bottom-right-radius:.25rem!important;border-top-right-radius:.25rem!important}.bootstrap .rounded-bottom{border-bottom-left-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.bootstrap .rounded-left{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.bootstrap .rounded-lg{border-radius:.3rem!important}.bootstrap .rounded-circle{border-radius:50%!important}.bootstrap .rounded-pill{border-radius:50rem!important}.bootstrap .rounded-0{border-radius:0!important}.bootstrap .clearfix:after{clear:both;content:"";display:block}.bootstrap .d-none{display:none!important}.bootstrap .d-inline{display:inline!important}.bootstrap .d-inline-block{display:inline-block!important}.bootstrap .d-block{display:block!important}.bootstrap .d-table{display:table!important}.bootstrap .d-table-row{display:table-row!important}.bootstrap .d-table-cell{display:table-cell!important}.bootstrap .d-flex{display:flex!important}.bootstrap .d-inline-flex{display:inline-flex!important}@media(min-width:576px){.bootstrap .d-sm-none{display:none!important}.bootstrap .d-sm-inline{display:inline!important}.bootstrap .d-sm-inline-block{display:inline-block!important}.bootstrap .d-sm-block{display:block!important}.bootstrap .d-sm-table{display:table!important}.bootstrap .d-sm-table-row{display:table-row!important}.bootstrap .d-sm-table-cell{display:table-cell!important}.bootstrap .d-sm-flex{display:flex!important}.bootstrap .d-sm-inline-flex{display:inline-flex!important}}@media(min-width:768px){.bootstrap .d-md-none{display:none!important}.bootstrap .d-md-inline{display:inline!important}.bootstrap .d-md-inline-block{display:inline-block!important}.bootstrap .d-md-block{display:block!important}.bootstrap .d-md-table{display:table!important}.bootstrap .d-md-table-row{display:table-row!important}.bootstrap .d-md-table-cell{display:table-cell!important}.bootstrap .d-md-flex{display:flex!important}.bootstrap .d-md-inline-flex{display:inline-flex!important}}@media(min-width:992px){.bootstrap .d-lg-none{display:none!important}.bootstrap .d-lg-inline{display:inline!important}.bootstrap .d-lg-inline-block{display:inline-block!important}.bootstrap .d-lg-block{display:block!important}.bootstrap .d-lg-table{display:table!important}.bootstrap .d-lg-table-row{display:table-row!important}.bootstrap .d-lg-table-cell{display:table-cell!important}.bootstrap .d-lg-flex{display:flex!important}.bootstrap .d-lg-inline-flex{display:inline-flex!important}}@media(min-width:1200px){.bootstrap .d-xl-none{display:none!important}.bootstrap .d-xl-inline{display:inline!important}.bootstrap .d-xl-inline-block{display:inline-block!important}.bootstrap .d-xl-block{display:block!important}.bootstrap .d-xl-table{display:table!important}.bootstrap .d-xl-table-row{display:table-row!important}.bootstrap .d-xl-table-cell{display:table-cell!important}.bootstrap .d-xl-flex{display:flex!important}.bootstrap .d-xl-inline-flex{display:inline-flex!important}}@media print{.bootstrap .d-print-none{display:none!important}.bootstrap .d-print-inline{display:inline!important}.bootstrap .d-print-inline-block{display:inline-block!important}.bootstrap .d-print-block{display:block!important}.bootstrap .d-print-table{display:table!important}.bootstrap .d-print-table-row{display:table-row!important}.bootstrap .d-print-table-cell{display:table-cell!important}.bootstrap .d-print-flex{display:flex!important}.bootstrap .d-print-inline-flex{display:inline-flex!important}}.bootstrap .embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.bootstrap .embed-responsive:before{content:"";display:block}.bootstrap .embed-responsive .embed-responsive-item,.bootstrap .embed-responsive embed,.bootstrap .embed-responsive iframe,.bootstrap .embed-responsive object,.bootstrap .embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.bootstrap .embed-responsive-21by9:before{padding-top:42.85714286%}.bootstrap .embed-responsive-16by9:before{padding-top:56.25%}.bootstrap .embed-responsive-4by3:before{padding-top:75%}.bootstrap .embed-responsive-1by1:before{padding-top:100%}.bootstrap .flex-row{flex-direction:row!important}.bootstrap .flex-column{flex-direction:column!important}.bootstrap .flex-row-reverse{flex-direction:row-reverse!important}.bootstrap .flex-column-reverse{flex-direction:column-reverse!important}.bootstrap .flex-wrap{flex-wrap:wrap!important}.bootstrap .flex-nowrap{flex-wrap:nowrap!important}.bootstrap .flex-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap .flex-fill{flex:1 1 auto!important}.bootstrap .flex-grow-0{flex-grow:0!important}.bootstrap .flex-grow-1{flex-grow:1!important}.bootstrap .flex-shrink-0{flex-shrink:0!important}.bootstrap .flex-shrink-1{flex-shrink:1!important}.bootstrap .justify-content-start{justify-content:flex-start!important}.bootstrap .justify-content-end{justify-content:flex-end!important}.bootstrap .justify-content-center{justify-content:center!important}.bootstrap .justify-content-between{justify-content:space-between!important}.bootstrap .justify-content-around{justify-content:space-around!important}.bootstrap .align-items-start{align-items:flex-start!important}.bootstrap .align-items-end{align-items:flex-end!important}.bootstrap .align-items-center{align-items:center!important}.bootstrap .align-items-baseline{align-items:baseline!important}.bootstrap .align-items-stretch{align-items:stretch!important}.bootstrap .align-content-start{align-content:flex-start!important}.bootstrap .align-content-end{align-content:flex-end!important}.bootstrap .align-content-center{align-content:center!important}.bootstrap .align-content-between{align-content:space-between!important}.bootstrap .align-content-around{align-content:space-around!important}.bootstrap .align-content-stretch{align-content:stretch!important}.bootstrap .align-self-auto{align-self:auto!important}.bootstrap .align-self-start{align-self:flex-start!important}.bootstrap .align-self-end{align-self:flex-end!important}.bootstrap .align-self-center{align-self:center!important}.bootstrap .align-self-baseline{align-self:baseline!important}.bootstrap .align-self-stretch{align-self:stretch!important}@media(min-width:576px){.bootstrap .flex-sm-row{flex-direction:row!important}.bootstrap .flex-sm-column{flex-direction:column!important}.bootstrap .flex-sm-row-reverse{flex-direction:row-reverse!important}.bootstrap .flex-sm-column-reverse{flex-direction:column-reverse!important}.bootstrap .flex-sm-wrap{flex-wrap:wrap!important}.bootstrap .flex-sm-nowrap{flex-wrap:nowrap!important}.bootstrap .flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap .flex-sm-fill{flex:1 1 auto!important}.bootstrap .flex-sm-grow-0{flex-grow:0!important}.bootstrap .flex-sm-grow-1{flex-grow:1!important}.bootstrap .flex-sm-shrink-0{flex-shrink:0!important}.bootstrap .flex-sm-shrink-1{flex-shrink:1!important}.bootstrap .justify-content-sm-start{justify-content:flex-start!important}.bootstrap .justify-content-sm-end{justify-content:flex-end!important}.bootstrap .justify-content-sm-center{justify-content:center!important}.bootstrap .justify-content-sm-between{justify-content:space-between!important}.bootstrap .justify-content-sm-around{justify-content:space-around!important}.bootstrap .align-items-sm-start{align-items:flex-start!important}.bootstrap .align-items-sm-end{align-items:flex-end!important}.bootstrap .align-items-sm-center{align-items:center!important}.bootstrap .align-items-sm-baseline{align-items:baseline!important}.bootstrap .align-items-sm-stretch{align-items:stretch!important}.bootstrap .align-content-sm-start{align-content:flex-start!important}.bootstrap .align-content-sm-end{align-content:flex-end!important}.bootstrap .align-content-sm-center{align-content:center!important}.bootstrap .align-content-sm-between{align-content:space-between!important}.bootstrap .align-content-sm-around{align-content:space-around!important}.bootstrap .align-content-sm-stretch{align-content:stretch!important}.bootstrap .align-self-sm-auto{align-self:auto!important}.bootstrap .align-self-sm-start{align-self:flex-start!important}.bootstrap .align-self-sm-end{align-self:flex-end!important}.bootstrap .align-self-sm-center{align-self:center!important}.bootstrap .align-self-sm-baseline{align-self:baseline!important}.bootstrap .align-self-sm-stretch{align-self:stretch!important}}@media(min-width:768px){.bootstrap .flex-md-row{flex-direction:row!important}.bootstrap .flex-md-column{flex-direction:column!important}.bootstrap .flex-md-row-reverse{flex-direction:row-reverse!important}.bootstrap .flex-md-column-reverse{flex-direction:column-reverse!important}.bootstrap .flex-md-wrap{flex-wrap:wrap!important}.bootstrap .flex-md-nowrap{flex-wrap:nowrap!important}.bootstrap .flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap .flex-md-fill{flex:1 1 auto!important}.bootstrap .flex-md-grow-0{flex-grow:0!important}.bootstrap .flex-md-grow-1{flex-grow:1!important}.bootstrap .flex-md-shrink-0{flex-shrink:0!important}.bootstrap .flex-md-shrink-1{flex-shrink:1!important}.bootstrap .justify-content-md-start{justify-content:flex-start!important}.bootstrap .justify-content-md-end{justify-content:flex-end!important}.bootstrap .justify-content-md-center{justify-content:center!important}.bootstrap .justify-content-md-between{justify-content:space-between!important}.bootstrap .justify-content-md-around{justify-content:space-around!important}.bootstrap .align-items-md-start{align-items:flex-start!important}.bootstrap .align-items-md-end{align-items:flex-end!important}.bootstrap .align-items-md-center{align-items:center!important}.bootstrap .align-items-md-baseline{align-items:baseline!important}.bootstrap .align-items-md-stretch{align-items:stretch!important}.bootstrap .align-content-md-start{align-content:flex-start!important}.bootstrap .align-content-md-end{align-content:flex-end!important}.bootstrap .align-content-md-center{align-content:center!important}.bootstrap .align-content-md-between{align-content:space-between!important}.bootstrap .align-content-md-around{align-content:space-around!important}.bootstrap .align-content-md-stretch{align-content:stretch!important}.bootstrap .align-self-md-auto{align-self:auto!important}.bootstrap .align-self-md-start{align-self:flex-start!important}.bootstrap .align-self-md-end{align-self:flex-end!important}.bootstrap .align-self-md-center{align-self:center!important}.bootstrap .align-self-md-baseline{align-self:baseline!important}.bootstrap .align-self-md-stretch{align-self:stretch!important}}@media(min-width:992px){.bootstrap .flex-lg-row{flex-direction:row!important}.bootstrap .flex-lg-column{flex-direction:column!important}.bootstrap .flex-lg-row-reverse{flex-direction:row-reverse!important}.bootstrap .flex-lg-column-reverse{flex-direction:column-reverse!important}.bootstrap .flex-lg-wrap{flex-wrap:wrap!important}.bootstrap .flex-lg-nowrap{flex-wrap:nowrap!important}.bootstrap .flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap .flex-lg-fill{flex:1 1 auto!important}.bootstrap .flex-lg-grow-0{flex-grow:0!important}.bootstrap .flex-lg-grow-1{flex-grow:1!important}.bootstrap .flex-lg-shrink-0{flex-shrink:0!important}.bootstrap .flex-lg-shrink-1{flex-shrink:1!important}.bootstrap .justify-content-lg-start{justify-content:flex-start!important}.bootstrap .justify-content-lg-end{justify-content:flex-end!important}.bootstrap .justify-content-lg-center{justify-content:center!important}.bootstrap .justify-content-lg-between{justify-content:space-between!important}.bootstrap .justify-content-lg-around{justify-content:space-around!important}.bootstrap .align-items-lg-start{align-items:flex-start!important}.bootstrap .align-items-lg-end{align-items:flex-end!important}.bootstrap .align-items-lg-center{align-items:center!important}.bootstrap .align-items-lg-baseline{align-items:baseline!important}.bootstrap .align-items-lg-stretch{align-items:stretch!important}.bootstrap .align-content-lg-start{align-content:flex-start!important}.bootstrap .align-content-lg-end{align-content:flex-end!important}.bootstrap .align-content-lg-center{align-content:center!important}.bootstrap .align-content-lg-between{align-content:space-between!important}.bootstrap .align-content-lg-around{align-content:space-around!important}.bootstrap .align-content-lg-stretch{align-content:stretch!important}.bootstrap .align-self-lg-auto{align-self:auto!important}.bootstrap .align-self-lg-start{align-self:flex-start!important}.bootstrap .align-self-lg-end{align-self:flex-end!important}.bootstrap .align-self-lg-center{align-self:center!important}.bootstrap .align-self-lg-baseline{align-self:baseline!important}.bootstrap .align-self-lg-stretch{align-self:stretch!important}}@media(min-width:1200px){.bootstrap .flex-xl-row{flex-direction:row!important}.bootstrap .flex-xl-column{flex-direction:column!important}.bootstrap .flex-xl-row-reverse{flex-direction:row-reverse!important}.bootstrap .flex-xl-column-reverse{flex-direction:column-reverse!important}.bootstrap .flex-xl-wrap{flex-wrap:wrap!important}.bootstrap .flex-xl-nowrap{flex-wrap:nowrap!important}.bootstrap .flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap .flex-xl-fill{flex:1 1 auto!important}.bootstrap .flex-xl-grow-0{flex-grow:0!important}.bootstrap .flex-xl-grow-1{flex-grow:1!important}.bootstrap .flex-xl-shrink-0{flex-shrink:0!important}.bootstrap .flex-xl-shrink-1{flex-shrink:1!important}.bootstrap .justify-content-xl-start{justify-content:flex-start!important}.bootstrap .justify-content-xl-end{justify-content:flex-end!important}.bootstrap .justify-content-xl-center{justify-content:center!important}.bootstrap .justify-content-xl-between{justify-content:space-between!important}.bootstrap .justify-content-xl-around{justify-content:space-around!important}.bootstrap .align-items-xl-start{align-items:flex-start!important}.bootstrap .align-items-xl-end{align-items:flex-end!important}.bootstrap .align-items-xl-center{align-items:center!important}.bootstrap .align-items-xl-baseline{align-items:baseline!important}.bootstrap .align-items-xl-stretch{align-items:stretch!important}.bootstrap .align-content-xl-start{align-content:flex-start!important}.bootstrap .align-content-xl-end{align-content:flex-end!important}.bootstrap .align-content-xl-center{align-content:center!important}.bootstrap .align-content-xl-between{align-content:space-between!important}.bootstrap .align-content-xl-around{align-content:space-around!important}.bootstrap .align-content-xl-stretch{align-content:stretch!important}.bootstrap .align-self-xl-auto{align-self:auto!important}.bootstrap .align-self-xl-start{align-self:flex-start!important}.bootstrap .align-self-xl-end{align-self:flex-end!important}.bootstrap .align-self-xl-center{align-self:center!important}.bootstrap .align-self-xl-baseline{align-self:baseline!important}.bootstrap .align-self-xl-stretch{align-self:stretch!important}}.bootstrap .float-left{float:left!important}.bootstrap .float-right{float:right!important}.bootstrap .float-none{float:none!important}@media(min-width:576px){.bootstrap .float-sm-left{float:left!important}.bootstrap .float-sm-right{float:right!important}.bootstrap .float-sm-none{float:none!important}}@media(min-width:768px){.bootstrap .float-md-left{float:left!important}.bootstrap .float-md-right{float:right!important}.bootstrap .float-md-none{float:none!important}}@media(min-width:992px){.bootstrap .float-lg-left{float:left!important}.bootstrap .float-lg-right{float:right!important}.bootstrap .float-lg-none{float:none!important}}@media(min-width:1200px){.bootstrap .float-xl-left{float:left!important}.bootstrap .float-xl-right{float:right!important}.bootstrap .float-xl-none{float:none!important}}.bootstrap .user-select-all{-webkit-user-select:all!important;user-select:all!important}.bootstrap .user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.bootstrap .user-select-none{-webkit-user-select:none!important;user-select:none!important}.bootstrap .overflow-auto{overflow:auto!important}.bootstrap .overflow-hidden{overflow:hidden!important}.bootstrap .position-static{position:static!important}.bootstrap .position-relative{position:relative!important}.bootstrap .position-absolute{position:absolute!important}.bootstrap .position-fixed{position:fixed!important}.bootstrap .position-sticky{position:-webkit-sticky!important;position:sticky!important}.bootstrap .fixed-top{left:0;position:fixed;right:0;top:0;z-index:1030}.bootstrap .fixed-bottom{bottom:0;left:0;position:fixed;right:0;z-index:1030}@supports((position:-webkit-sticky) or (position:sticky)){.bootstrap .sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.bootstrap .sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.bootstrap .sr-only-focusable:active,.bootstrap .sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.bootstrap .shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.bootstrap .shadow{box-shadow:0 .5rem 1rem #00000026!important}.bootstrap .shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.bootstrap .shadow-none{box-shadow:none!important}.bootstrap .w-25{width:25%!important}.bootstrap .w-50{width:50%!important}.bootstrap .w-75{width:75%!important}.bootstrap .w-100{width:100%!important}.bootstrap .w-auto{width:auto!important}.bootstrap .h-25{height:25%!important}.bootstrap .h-50{height:50%!important}.bootstrap .h-75{height:75%!important}.bootstrap .h-100{height:100%!important}.bootstrap .h-auto{height:auto!important}.bootstrap .mw-100{max-width:100%!important}.bootstrap .mh-100{max-height:100%!important}.bootstrap .min-vw-100{min-width:100vw!important}.bootstrap .min-vh-100{min-height:100vh!important}.bootstrap .vw-100{width:100vw!important}.bootstrap .vh-100{height:100vh!important}.bootstrap .m-0{margin:0!important}.bootstrap .mt-0,.bootstrap .my-0{margin-top:0!important}.bootstrap .mr-0,.bootstrap .mx-0{margin-right:0!important}.bootstrap .mb-0,.bootstrap .my-0{margin-bottom:0!important}.bootstrap .ml-0,.bootstrap .mx-0{margin-left:0!important}.bootstrap .m-1{margin:.25rem!important}.bootstrap .mt-1,.bootstrap .my-1{margin-top:.25rem!important}.bootstrap .mr-1,.bootstrap .mx-1{margin-right:.25rem!important}.bootstrap .mb-1,.bootstrap .my-1{margin-bottom:.25rem!important}.bootstrap .ml-1,.bootstrap .mx-1{margin-left:.25rem!important}.bootstrap .m-2{margin:.5rem!important}.bootstrap .mt-2,.bootstrap .my-2{margin-top:.5rem!important}.bootstrap .mr-2,.bootstrap .mx-2{margin-right:.5rem!important}.bootstrap .mb-2,.bootstrap .my-2{margin-bottom:.5rem!important}.bootstrap .ml-2,.bootstrap .mx-2{margin-left:.5rem!important}.bootstrap .m-3{margin:1rem!important}.bootstrap .mt-3,.bootstrap .my-3{margin-top:1rem!important}.bootstrap .mr-3,.bootstrap .mx-3{margin-right:1rem!important}.bootstrap .mb-3,.bootstrap .my-3{margin-bottom:1rem!important}.bootstrap .ml-3,.bootstrap .mx-3{margin-left:1rem!important}.bootstrap .m-4{margin:1.5rem!important}.bootstrap .mt-4,.bootstrap .my-4{margin-top:1.5rem!important}.bootstrap .mr-4,.bootstrap .mx-4{margin-right:1.5rem!important}.bootstrap .mb-4,.bootstrap .my-4{margin-bottom:1.5rem!important}.bootstrap .ml-4,.bootstrap .mx-4{margin-left:1.5rem!important}.bootstrap .m-5{margin:3rem!important}.bootstrap .mt-5,.bootstrap .my-5{margin-top:3rem!important}.bootstrap .mr-5,.bootstrap .mx-5{margin-right:3rem!important}.bootstrap .mb-5,.bootstrap .my-5{margin-bottom:3rem!important}.bootstrap .ml-5,.bootstrap .mx-5{margin-left:3rem!important}.bootstrap .p-0{padding:0!important}.bootstrap .pt-0,.bootstrap .py-0{padding-top:0!important}.bootstrap .pr-0,.bootstrap .px-0{padding-right:0!important}.bootstrap .pb-0,.bootstrap .py-0{padding-bottom:0!important}.bootstrap .pl-0,.bootstrap .px-0{padding-left:0!important}.bootstrap .p-1{padding:.25rem!important}.bootstrap .pt-1,.bootstrap .py-1{padding-top:.25rem!important}.bootstrap .pr-1,.bootstrap .px-1{padding-right:.25rem!important}.bootstrap .pb-1,.bootstrap .py-1{padding-bottom:.25rem!important}.bootstrap .pl-1,.bootstrap .px-1{padding-left:.25rem!important}.bootstrap .p-2{padding:.5rem!important}.bootstrap .pt-2,.bootstrap .py-2{padding-top:.5rem!important}.bootstrap .pr-2,.bootstrap .px-2{padding-right:.5rem!important}.bootstrap .pb-2,.bootstrap .py-2{padding-bottom:.5rem!important}.bootstrap .pl-2,.bootstrap .px-2{padding-left:.5rem!important}.bootstrap .p-3{padding:1rem!important}.bootstrap .pt-3,.bootstrap .py-3{padding-top:1rem!important}.bootstrap .pr-3,.bootstrap .px-3{padding-right:1rem!important}.bootstrap .pb-3,.bootstrap .py-3{padding-bottom:1rem!important}.bootstrap .pl-3,.bootstrap .px-3{padding-left:1rem!important}.bootstrap .p-4{padding:1.5rem!important}.bootstrap .pt-4,.bootstrap .py-4{padding-top:1.5rem!important}.bootstrap .pr-4,.bootstrap .px-4{padding-right:1.5rem!important}.bootstrap .pb-4,.bootstrap .py-4{padding-bottom:1.5rem!important}.bootstrap .pl-4,.bootstrap .px-4{padding-left:1.5rem!important}.bootstrap .p-5{padding:3rem!important}.bootstrap .pt-5,.bootstrap .py-5{padding-top:3rem!important}.bootstrap .pr-5,.bootstrap .px-5{padding-right:3rem!important}.bootstrap .pb-5,.bootstrap .py-5{padding-bottom:3rem!important}.bootstrap .pl-5,.bootstrap .px-5{padding-left:3rem!important}.bootstrap .m-n1{margin:-.25rem!important}.bootstrap .mt-n1,.bootstrap .my-n1{margin-top:-.25rem!important}.bootstrap .mr-n1,.bootstrap .mx-n1{margin-right:-.25rem!important}.bootstrap .mb-n1,.bootstrap .my-n1{margin-bottom:-.25rem!important}.bootstrap .ml-n1,.bootstrap .mx-n1{margin-left:-.25rem!important}.bootstrap .m-n2{margin:-.5rem!important}.bootstrap .mt-n2,.bootstrap .my-n2{margin-top:-.5rem!important}.bootstrap .mr-n2,.bootstrap .mx-n2{margin-right:-.5rem!important}.bootstrap .mb-n2,.bootstrap .my-n2{margin-bottom:-.5rem!important}.bootstrap .ml-n2,.bootstrap .mx-n2{margin-left:-.5rem!important}.bootstrap .m-n3{margin:-1rem!important}.bootstrap .mt-n3,.bootstrap .my-n3{margin-top:-1rem!important}.bootstrap .mr-n3,.bootstrap .mx-n3{margin-right:-1rem!important}.bootstrap .mb-n3,.bootstrap .my-n3{margin-bottom:-1rem!important}.bootstrap .ml-n3,.bootstrap .mx-n3{margin-left:-1rem!important}.bootstrap .m-n4{margin:-1.5rem!important}.bootstrap .mt-n4,.bootstrap .my-n4{margin-top:-1.5rem!important}.bootstrap .mr-n4,.bootstrap .mx-n4{margin-right:-1.5rem!important}.bootstrap .mb-n4,.bootstrap .my-n4{margin-bottom:-1.5rem!important}.bootstrap .ml-n4,.bootstrap .mx-n4{margin-left:-1.5rem!important}.bootstrap .m-n5{margin:-3rem!important}.bootstrap .mt-n5,.bootstrap .my-n5{margin-top:-3rem!important}.bootstrap .mr-n5,.bootstrap .mx-n5{margin-right:-3rem!important}.bootstrap .mb-n5,.bootstrap .my-n5{margin-bottom:-3rem!important}.bootstrap .ml-n5,.bootstrap .mx-n5{margin-left:-3rem!important}.bootstrap .m-auto{margin:auto!important}.bootstrap .mt-auto,.bootstrap .my-auto{margin-top:auto!important}.bootstrap .mr-auto,.bootstrap .mx-auto{margin-right:auto!important}.bootstrap .mb-auto,.bootstrap .my-auto{margin-bottom:auto!important}.bootstrap .ml-auto,.bootstrap .mx-auto{margin-left:auto!important}@media(min-width:576px){.bootstrap .m-sm-0{margin:0!important}.bootstrap .mt-sm-0,.bootstrap .my-sm-0{margin-top:0!important}.bootstrap .mr-sm-0,.bootstrap .mx-sm-0{margin-right:0!important}.bootstrap .mb-sm-0,.bootstrap .my-sm-0{margin-bottom:0!important}.bootstrap .ml-sm-0,.bootstrap .mx-sm-0{margin-left:0!important}.bootstrap .m-sm-1{margin:.25rem!important}.bootstrap .mt-sm-1,.bootstrap .my-sm-1{margin-top:.25rem!important}.bootstrap .mr-sm-1,.bootstrap .mx-sm-1{margin-right:.25rem!important}.bootstrap .mb-sm-1,.bootstrap .my-sm-1{margin-bottom:.25rem!important}.bootstrap .ml-sm-1,.bootstrap .mx-sm-1{margin-left:.25rem!important}.bootstrap .m-sm-2{margin:.5rem!important}.bootstrap .mt-sm-2,.bootstrap .my-sm-2{margin-top:.5rem!important}.bootstrap .mr-sm-2,.bootstrap .mx-sm-2{margin-right:.5rem!important}.bootstrap .mb-sm-2,.bootstrap .my-sm-2{margin-bottom:.5rem!important}.bootstrap .ml-sm-2,.bootstrap .mx-sm-2{margin-left:.5rem!important}.bootstrap .m-sm-3{margin:1rem!important}.bootstrap .mt-sm-3,.bootstrap .my-sm-3{margin-top:1rem!important}.bootstrap .mr-sm-3,.bootstrap .mx-sm-3{margin-right:1rem!important}.bootstrap .mb-sm-3,.bootstrap .my-sm-3{margin-bottom:1rem!important}.bootstrap .ml-sm-3,.bootstrap .mx-sm-3{margin-left:1rem!important}.bootstrap .m-sm-4{margin:1.5rem!important}.bootstrap .mt-sm-4,.bootstrap .my-sm-4{margin-top:1.5rem!important}.bootstrap .mr-sm-4,.bootstrap .mx-sm-4{margin-right:1.5rem!important}.bootstrap .mb-sm-4,.bootstrap .my-sm-4{margin-bottom:1.5rem!important}.bootstrap .ml-sm-4,.bootstrap .mx-sm-4{margin-left:1.5rem!important}.bootstrap .m-sm-5{margin:3rem!important}.bootstrap .mt-sm-5,.bootstrap .my-sm-5{margin-top:3rem!important}.bootstrap .mr-sm-5,.bootstrap .mx-sm-5{margin-right:3rem!important}.bootstrap .mb-sm-5,.bootstrap .my-sm-5{margin-bottom:3rem!important}.bootstrap .ml-sm-5,.bootstrap .mx-sm-5{margin-left:3rem!important}.bootstrap .p-sm-0{padding:0!important}.bootstrap .pt-sm-0,.bootstrap .py-sm-0{padding-top:0!important}.bootstrap .pr-sm-0,.bootstrap .px-sm-0{padding-right:0!important}.bootstrap .pb-sm-0,.bootstrap .py-sm-0{padding-bottom:0!important}.bootstrap .pl-sm-0,.bootstrap .px-sm-0{padding-left:0!important}.bootstrap .p-sm-1{padding:.25rem!important}.bootstrap .pt-sm-1,.bootstrap .py-sm-1{padding-top:.25rem!important}.bootstrap .pr-sm-1,.bootstrap .px-sm-1{padding-right:.25rem!important}.bootstrap .pb-sm-1,.bootstrap .py-sm-1{padding-bottom:.25rem!important}.bootstrap .pl-sm-1,.bootstrap .px-sm-1{padding-left:.25rem!important}.bootstrap .p-sm-2{padding:.5rem!important}.bootstrap .pt-sm-2,.bootstrap .py-sm-2{padding-top:.5rem!important}.bootstrap .pr-sm-2,.bootstrap .px-sm-2{padding-right:.5rem!important}.bootstrap .pb-sm-2,.bootstrap .py-sm-2{padding-bottom:.5rem!important}.bootstrap .pl-sm-2,.bootstrap .px-sm-2{padding-left:.5rem!important}.bootstrap .p-sm-3{padding:1rem!important}.bootstrap .pt-sm-3,.bootstrap .py-sm-3{padding-top:1rem!important}.bootstrap .pr-sm-3,.bootstrap .px-sm-3{padding-right:1rem!important}.bootstrap .pb-sm-3,.bootstrap .py-sm-3{padding-bottom:1rem!important}.bootstrap .pl-sm-3,.bootstrap .px-sm-3{padding-left:1rem!important}.bootstrap .p-sm-4{padding:1.5rem!important}.bootstrap .pt-sm-4,.bootstrap .py-sm-4{padding-top:1.5rem!important}.bootstrap .pr-sm-4,.bootstrap .px-sm-4{padding-right:1.5rem!important}.bootstrap .pb-sm-4,.bootstrap .py-sm-4{padding-bottom:1.5rem!important}.bootstrap .pl-sm-4,.bootstrap .px-sm-4{padding-left:1.5rem!important}.bootstrap .p-sm-5{padding:3rem!important}.bootstrap .pt-sm-5,.bootstrap .py-sm-5{padding-top:3rem!important}.bootstrap .pr-sm-5,.bootstrap .px-sm-5{padding-right:3rem!important}.bootstrap .pb-sm-5,.bootstrap .py-sm-5{padding-bottom:3rem!important}.bootstrap .pl-sm-5,.bootstrap .px-sm-5{padding-left:3rem!important}.bootstrap .m-sm-n1{margin:-.25rem!important}.bootstrap .mt-sm-n1,.bootstrap .my-sm-n1{margin-top:-.25rem!important}.bootstrap .mr-sm-n1,.bootstrap .mx-sm-n1{margin-right:-.25rem!important}.bootstrap .mb-sm-n1,.bootstrap .my-sm-n1{margin-bottom:-.25rem!important}.bootstrap .ml-sm-n1,.bootstrap .mx-sm-n1{margin-left:-.25rem!important}.bootstrap .m-sm-n2{margin:-.5rem!important}.bootstrap .mt-sm-n2,.bootstrap .my-sm-n2{margin-top:-.5rem!important}.bootstrap .mr-sm-n2,.bootstrap .mx-sm-n2{margin-right:-.5rem!important}.bootstrap .mb-sm-n2,.bootstrap .my-sm-n2{margin-bottom:-.5rem!important}.bootstrap .ml-sm-n2,.bootstrap .mx-sm-n2{margin-left:-.5rem!important}.bootstrap .m-sm-n3{margin:-1rem!important}.bootstrap .mt-sm-n3,.bootstrap .my-sm-n3{margin-top:-1rem!important}.bootstrap .mr-sm-n3,.bootstrap .mx-sm-n3{margin-right:-1rem!important}.bootstrap .mb-sm-n3,.bootstrap .my-sm-n3{margin-bottom:-1rem!important}.bootstrap .ml-sm-n3,.bootstrap .mx-sm-n3{margin-left:-1rem!important}.bootstrap .m-sm-n4{margin:-1.5rem!important}.bootstrap .mt-sm-n4,.bootstrap .my-sm-n4{margin-top:-1.5rem!important}.bootstrap .mr-sm-n4,.bootstrap .mx-sm-n4{margin-right:-1.5rem!important}.bootstrap .mb-sm-n4,.bootstrap .my-sm-n4{margin-bottom:-1.5rem!important}.bootstrap .ml-sm-n4,.bootstrap .mx-sm-n4{margin-left:-1.5rem!important}.bootstrap .m-sm-n5{margin:-3rem!important}.bootstrap .mt-sm-n5,.bootstrap .my-sm-n5{margin-top:-3rem!important}.bootstrap .mr-sm-n5,.bootstrap .mx-sm-n5{margin-right:-3rem!important}.bootstrap .mb-sm-n5,.bootstrap .my-sm-n5{margin-bottom:-3rem!important}.bootstrap .ml-sm-n5,.bootstrap .mx-sm-n5{margin-left:-3rem!important}.bootstrap .m-sm-auto{margin:auto!important}.bootstrap .mt-sm-auto,.bootstrap .my-sm-auto{margin-top:auto!important}.bootstrap .mr-sm-auto,.bootstrap .mx-sm-auto{margin-right:auto!important}.bootstrap .mb-sm-auto,.bootstrap .my-sm-auto{margin-bottom:auto!important}.bootstrap .ml-sm-auto,.bootstrap .mx-sm-auto{margin-left:auto!important}}@media(min-width:768px){.bootstrap .m-md-0{margin:0!important}.bootstrap .mt-md-0,.bootstrap .my-md-0{margin-top:0!important}.bootstrap .mr-md-0,.bootstrap .mx-md-0{margin-right:0!important}.bootstrap .mb-md-0,.bootstrap .my-md-0{margin-bottom:0!important}.bootstrap .ml-md-0,.bootstrap .mx-md-0{margin-left:0!important}.bootstrap .m-md-1{margin:.25rem!important}.bootstrap .mt-md-1,.bootstrap .my-md-1{margin-top:.25rem!important}.bootstrap .mr-md-1,.bootstrap .mx-md-1{margin-right:.25rem!important}.bootstrap .mb-md-1,.bootstrap .my-md-1{margin-bottom:.25rem!important}.bootstrap .ml-md-1,.bootstrap .mx-md-1{margin-left:.25rem!important}.bootstrap .m-md-2{margin:.5rem!important}.bootstrap .mt-md-2,.bootstrap .my-md-2{margin-top:.5rem!important}.bootstrap .mr-md-2,.bootstrap .mx-md-2{margin-right:.5rem!important}.bootstrap .mb-md-2,.bootstrap .my-md-2{margin-bottom:.5rem!important}.bootstrap .ml-md-2,.bootstrap .mx-md-2{margin-left:.5rem!important}.bootstrap .m-md-3{margin:1rem!important}.bootstrap .mt-md-3,.bootstrap .my-md-3{margin-top:1rem!important}.bootstrap .mr-md-3,.bootstrap .mx-md-3{margin-right:1rem!important}.bootstrap .mb-md-3,.bootstrap .my-md-3{margin-bottom:1rem!important}.bootstrap .ml-md-3,.bootstrap .mx-md-3{margin-left:1rem!important}.bootstrap .m-md-4{margin:1.5rem!important}.bootstrap .mt-md-4,.bootstrap .my-md-4{margin-top:1.5rem!important}.bootstrap .mr-md-4,.bootstrap .mx-md-4{margin-right:1.5rem!important}.bootstrap .mb-md-4,.bootstrap .my-md-4{margin-bottom:1.5rem!important}.bootstrap .ml-md-4,.bootstrap .mx-md-4{margin-left:1.5rem!important}.bootstrap .m-md-5{margin:3rem!important}.bootstrap .mt-md-5,.bootstrap .my-md-5{margin-top:3rem!important}.bootstrap .mr-md-5,.bootstrap .mx-md-5{margin-right:3rem!important}.bootstrap .mb-md-5,.bootstrap .my-md-5{margin-bottom:3rem!important}.bootstrap .ml-md-5,.bootstrap .mx-md-5{margin-left:3rem!important}.bootstrap .p-md-0{padding:0!important}.bootstrap .pt-md-0,.bootstrap .py-md-0{padding-top:0!important}.bootstrap .pr-md-0,.bootstrap .px-md-0{padding-right:0!important}.bootstrap .pb-md-0,.bootstrap .py-md-0{padding-bottom:0!important}.bootstrap .pl-md-0,.bootstrap .px-md-0{padding-left:0!important}.bootstrap .p-md-1{padding:.25rem!important}.bootstrap .pt-md-1,.bootstrap .py-md-1{padding-top:.25rem!important}.bootstrap .pr-md-1,.bootstrap .px-md-1{padding-right:.25rem!important}.bootstrap .pb-md-1,.bootstrap .py-md-1{padding-bottom:.25rem!important}.bootstrap .pl-md-1,.bootstrap .px-md-1{padding-left:.25rem!important}.bootstrap .p-md-2{padding:.5rem!important}.bootstrap .pt-md-2,.bootstrap .py-md-2{padding-top:.5rem!important}.bootstrap .pr-md-2,.bootstrap .px-md-2{padding-right:.5rem!important}.bootstrap .pb-md-2,.bootstrap .py-md-2{padding-bottom:.5rem!important}.bootstrap .pl-md-2,.bootstrap .px-md-2{padding-left:.5rem!important}.bootstrap .p-md-3{padding:1rem!important}.bootstrap .pt-md-3,.bootstrap .py-md-3{padding-top:1rem!important}.bootstrap .pr-md-3,.bootstrap .px-md-3{padding-right:1rem!important}.bootstrap .pb-md-3,.bootstrap .py-md-3{padding-bottom:1rem!important}.bootstrap .pl-md-3,.bootstrap .px-md-3{padding-left:1rem!important}.bootstrap .p-md-4{padding:1.5rem!important}.bootstrap .pt-md-4,.bootstrap .py-md-4{padding-top:1.5rem!important}.bootstrap .pr-md-4,.bootstrap .px-md-4{padding-right:1.5rem!important}.bootstrap .pb-md-4,.bootstrap .py-md-4{padding-bottom:1.5rem!important}.bootstrap .pl-md-4,.bootstrap .px-md-4{padding-left:1.5rem!important}.bootstrap .p-md-5{padding:3rem!important}.bootstrap .pt-md-5,.bootstrap .py-md-5{padding-top:3rem!important}.bootstrap .pr-md-5,.bootstrap .px-md-5{padding-right:3rem!important}.bootstrap .pb-md-5,.bootstrap .py-md-5{padding-bottom:3rem!important}.bootstrap .pl-md-5,.bootstrap .px-md-5{padding-left:3rem!important}.bootstrap .m-md-n1{margin:-.25rem!important}.bootstrap .mt-md-n1,.bootstrap .my-md-n1{margin-top:-.25rem!important}.bootstrap .mr-md-n1,.bootstrap .mx-md-n1{margin-right:-.25rem!important}.bootstrap .mb-md-n1,.bootstrap .my-md-n1{margin-bottom:-.25rem!important}.bootstrap .ml-md-n1,.bootstrap .mx-md-n1{margin-left:-.25rem!important}.bootstrap .m-md-n2{margin:-.5rem!important}.bootstrap .mt-md-n2,.bootstrap .my-md-n2{margin-top:-.5rem!important}.bootstrap .mr-md-n2,.bootstrap .mx-md-n2{margin-right:-.5rem!important}.bootstrap .mb-md-n2,.bootstrap .my-md-n2{margin-bottom:-.5rem!important}.bootstrap .ml-md-n2,.bootstrap .mx-md-n2{margin-left:-.5rem!important}.bootstrap .m-md-n3{margin:-1rem!important}.bootstrap .mt-md-n3,.bootstrap .my-md-n3{margin-top:-1rem!important}.bootstrap .mr-md-n3,.bootstrap .mx-md-n3{margin-right:-1rem!important}.bootstrap .mb-md-n3,.bootstrap .my-md-n3{margin-bottom:-1rem!important}.bootstrap .ml-md-n3,.bootstrap .mx-md-n3{margin-left:-1rem!important}.bootstrap .m-md-n4{margin:-1.5rem!important}.bootstrap .mt-md-n4,.bootstrap .my-md-n4{margin-top:-1.5rem!important}.bootstrap .mr-md-n4,.bootstrap .mx-md-n4{margin-right:-1.5rem!important}.bootstrap .mb-md-n4,.bootstrap .my-md-n4{margin-bottom:-1.5rem!important}.bootstrap .ml-md-n4,.bootstrap .mx-md-n4{margin-left:-1.5rem!important}.bootstrap .m-md-n5{margin:-3rem!important}.bootstrap .mt-md-n5,.bootstrap .my-md-n5{margin-top:-3rem!important}.bootstrap .mr-md-n5,.bootstrap .mx-md-n5{margin-right:-3rem!important}.bootstrap .mb-md-n5,.bootstrap .my-md-n5{margin-bottom:-3rem!important}.bootstrap .ml-md-n5,.bootstrap .mx-md-n5{margin-left:-3rem!important}.bootstrap .m-md-auto{margin:auto!important}.bootstrap .mt-md-auto,.bootstrap .my-md-auto{margin-top:auto!important}.bootstrap .mr-md-auto,.bootstrap .mx-md-auto{margin-right:auto!important}.bootstrap .mb-md-auto,.bootstrap .my-md-auto{margin-bottom:auto!important}.bootstrap .ml-md-auto,.bootstrap .mx-md-auto{margin-left:auto!important}}@media(min-width:992px){.bootstrap .m-lg-0{margin:0!important}.bootstrap .mt-lg-0,.bootstrap .my-lg-0{margin-top:0!important}.bootstrap .mr-lg-0,.bootstrap .mx-lg-0{margin-right:0!important}.bootstrap .mb-lg-0,.bootstrap .my-lg-0{margin-bottom:0!important}.bootstrap .ml-lg-0,.bootstrap .mx-lg-0{margin-left:0!important}.bootstrap .m-lg-1{margin:.25rem!important}.bootstrap .mt-lg-1,.bootstrap .my-lg-1{margin-top:.25rem!important}.bootstrap .mr-lg-1,.bootstrap .mx-lg-1{margin-right:.25rem!important}.bootstrap .mb-lg-1,.bootstrap .my-lg-1{margin-bottom:.25rem!important}.bootstrap .ml-lg-1,.bootstrap .mx-lg-1{margin-left:.25rem!important}.bootstrap .m-lg-2{margin:.5rem!important}.bootstrap .mt-lg-2,.bootstrap .my-lg-2{margin-top:.5rem!important}.bootstrap .mr-lg-2,.bootstrap .mx-lg-2{margin-right:.5rem!important}.bootstrap .mb-lg-2,.bootstrap .my-lg-2{margin-bottom:.5rem!important}.bootstrap .ml-lg-2,.bootstrap .mx-lg-2{margin-left:.5rem!important}.bootstrap .m-lg-3{margin:1rem!important}.bootstrap .mt-lg-3,.bootstrap .my-lg-3{margin-top:1rem!important}.bootstrap .mr-lg-3,.bootstrap .mx-lg-3{margin-right:1rem!important}.bootstrap .mb-lg-3,.bootstrap .my-lg-3{margin-bottom:1rem!important}.bootstrap .ml-lg-3,.bootstrap .mx-lg-3{margin-left:1rem!important}.bootstrap .m-lg-4{margin:1.5rem!important}.bootstrap .mt-lg-4,.bootstrap .my-lg-4{margin-top:1.5rem!important}.bootstrap .mr-lg-4,.bootstrap .mx-lg-4{margin-right:1.5rem!important}.bootstrap .mb-lg-4,.bootstrap .my-lg-4{margin-bottom:1.5rem!important}.bootstrap .ml-lg-4,.bootstrap .mx-lg-4{margin-left:1.5rem!important}.bootstrap .m-lg-5{margin:3rem!important}.bootstrap .mt-lg-5,.bootstrap .my-lg-5{margin-top:3rem!important}.bootstrap .mr-lg-5,.bootstrap .mx-lg-5{margin-right:3rem!important}.bootstrap .mb-lg-5,.bootstrap .my-lg-5{margin-bottom:3rem!important}.bootstrap .ml-lg-5,.bootstrap .mx-lg-5{margin-left:3rem!important}.bootstrap .p-lg-0{padding:0!important}.bootstrap .pt-lg-0,.bootstrap .py-lg-0{padding-top:0!important}.bootstrap .pr-lg-0,.bootstrap .px-lg-0{padding-right:0!important}.bootstrap .pb-lg-0,.bootstrap .py-lg-0{padding-bottom:0!important}.bootstrap .pl-lg-0,.bootstrap .px-lg-0{padding-left:0!important}.bootstrap .p-lg-1{padding:.25rem!important}.bootstrap .pt-lg-1,.bootstrap .py-lg-1{padding-top:.25rem!important}.bootstrap .pr-lg-1,.bootstrap .px-lg-1{padding-right:.25rem!important}.bootstrap .pb-lg-1,.bootstrap .py-lg-1{padding-bottom:.25rem!important}.bootstrap .pl-lg-1,.bootstrap .px-lg-1{padding-left:.25rem!important}.bootstrap .p-lg-2{padding:.5rem!important}.bootstrap .pt-lg-2,.bootstrap .py-lg-2{padding-top:.5rem!important}.bootstrap .pr-lg-2,.bootstrap .px-lg-2{padding-right:.5rem!important}.bootstrap .pb-lg-2,.bootstrap .py-lg-2{padding-bottom:.5rem!important}.bootstrap .pl-lg-2,.bootstrap .px-lg-2{padding-left:.5rem!important}.bootstrap .p-lg-3{padding:1rem!important}.bootstrap .pt-lg-3,.bootstrap .py-lg-3{padding-top:1rem!important}.bootstrap .pr-lg-3,.bootstrap .px-lg-3{padding-right:1rem!important}.bootstrap .pb-lg-3,.bootstrap .py-lg-3{padding-bottom:1rem!important}.bootstrap .pl-lg-3,.bootstrap .px-lg-3{padding-left:1rem!important}.bootstrap .p-lg-4{padding:1.5rem!important}.bootstrap .pt-lg-4,.bootstrap .py-lg-4{padding-top:1.5rem!important}.bootstrap .pr-lg-4,.bootstrap .px-lg-4{padding-right:1.5rem!important}.bootstrap .pb-lg-4,.bootstrap .py-lg-4{padding-bottom:1.5rem!important}.bootstrap .pl-lg-4,.bootstrap .px-lg-4{padding-left:1.5rem!important}.bootstrap .p-lg-5{padding:3rem!important}.bootstrap .pt-lg-5,.bootstrap .py-lg-5{padding-top:3rem!important}.bootstrap .pr-lg-5,.bootstrap .px-lg-5{padding-right:3rem!important}.bootstrap .pb-lg-5,.bootstrap .py-lg-5{padding-bottom:3rem!important}.bootstrap .pl-lg-5,.bootstrap .px-lg-5{padding-left:3rem!important}.bootstrap .m-lg-n1{margin:-.25rem!important}.bootstrap .mt-lg-n1,.bootstrap .my-lg-n1{margin-top:-.25rem!important}.bootstrap .mr-lg-n1,.bootstrap .mx-lg-n1{margin-right:-.25rem!important}.bootstrap .mb-lg-n1,.bootstrap .my-lg-n1{margin-bottom:-.25rem!important}.bootstrap .ml-lg-n1,.bootstrap .mx-lg-n1{margin-left:-.25rem!important}.bootstrap .m-lg-n2{margin:-.5rem!important}.bootstrap .mt-lg-n2,.bootstrap .my-lg-n2{margin-top:-.5rem!important}.bootstrap .mr-lg-n2,.bootstrap .mx-lg-n2{margin-right:-.5rem!important}.bootstrap .mb-lg-n2,.bootstrap .my-lg-n2{margin-bottom:-.5rem!important}.bootstrap .ml-lg-n2,.bootstrap .mx-lg-n2{margin-left:-.5rem!important}.bootstrap .m-lg-n3{margin:-1rem!important}.bootstrap .mt-lg-n3,.bootstrap .my-lg-n3{margin-top:-1rem!important}.bootstrap .mr-lg-n3,.bootstrap .mx-lg-n3{margin-right:-1rem!important}.bootstrap .mb-lg-n3,.bootstrap .my-lg-n3{margin-bottom:-1rem!important}.bootstrap .ml-lg-n3,.bootstrap .mx-lg-n3{margin-left:-1rem!important}.bootstrap .m-lg-n4{margin:-1.5rem!important}.bootstrap .mt-lg-n4,.bootstrap .my-lg-n4{margin-top:-1.5rem!important}.bootstrap .mr-lg-n4,.bootstrap .mx-lg-n4{margin-right:-1.5rem!important}.bootstrap .mb-lg-n4,.bootstrap .my-lg-n4{margin-bottom:-1.5rem!important}.bootstrap .ml-lg-n4,.bootstrap .mx-lg-n4{margin-left:-1.5rem!important}.bootstrap .m-lg-n5{margin:-3rem!important}.bootstrap .mt-lg-n5,.bootstrap .my-lg-n5{margin-top:-3rem!important}.bootstrap .mr-lg-n5,.bootstrap .mx-lg-n5{margin-right:-3rem!important}.bootstrap .mb-lg-n5,.bootstrap .my-lg-n5{margin-bottom:-3rem!important}.bootstrap .ml-lg-n5,.bootstrap .mx-lg-n5{margin-left:-3rem!important}.bootstrap .m-lg-auto{margin:auto!important}.bootstrap .mt-lg-auto,.bootstrap .my-lg-auto{margin-top:auto!important}.bootstrap .mr-lg-auto,.bootstrap .mx-lg-auto{margin-right:auto!important}.bootstrap .mb-lg-auto,.bootstrap .my-lg-auto{margin-bottom:auto!important}.bootstrap .ml-lg-auto,.bootstrap .mx-lg-auto{margin-left:auto!important}}@media(min-width:1200px){.bootstrap .m-xl-0{margin:0!important}.bootstrap .mt-xl-0,.bootstrap .my-xl-0{margin-top:0!important}.bootstrap .mr-xl-0,.bootstrap .mx-xl-0{margin-right:0!important}.bootstrap .mb-xl-0,.bootstrap .my-xl-0{margin-bottom:0!important}.bootstrap .ml-xl-0,.bootstrap .mx-xl-0{margin-left:0!important}.bootstrap .m-xl-1{margin:.25rem!important}.bootstrap .mt-xl-1,.bootstrap .my-xl-1{margin-top:.25rem!important}.bootstrap .mr-xl-1,.bootstrap .mx-xl-1{margin-right:.25rem!important}.bootstrap .mb-xl-1,.bootstrap .my-xl-1{margin-bottom:.25rem!important}.bootstrap .ml-xl-1,.bootstrap .mx-xl-1{margin-left:.25rem!important}.bootstrap .m-xl-2{margin:.5rem!important}.bootstrap .mt-xl-2,.bootstrap .my-xl-2{margin-top:.5rem!important}.bootstrap .mr-xl-2,.bootstrap .mx-xl-2{margin-right:.5rem!important}.bootstrap .mb-xl-2,.bootstrap .my-xl-2{margin-bottom:.5rem!important}.bootstrap .ml-xl-2,.bootstrap .mx-xl-2{margin-left:.5rem!important}.bootstrap .m-xl-3{margin:1rem!important}.bootstrap .mt-xl-3,.bootstrap .my-xl-3{margin-top:1rem!important}.bootstrap .mr-xl-3,.bootstrap .mx-xl-3{margin-right:1rem!important}.bootstrap .mb-xl-3,.bootstrap .my-xl-3{margin-bottom:1rem!important}.bootstrap .ml-xl-3,.bootstrap .mx-xl-3{margin-left:1rem!important}.bootstrap .m-xl-4{margin:1.5rem!important}.bootstrap .mt-xl-4,.bootstrap .my-xl-4{margin-top:1.5rem!important}.bootstrap .mr-xl-4,.bootstrap .mx-xl-4{margin-right:1.5rem!important}.bootstrap .mb-xl-4,.bootstrap .my-xl-4{margin-bottom:1.5rem!important}.bootstrap .ml-xl-4,.bootstrap .mx-xl-4{margin-left:1.5rem!important}.bootstrap .m-xl-5{margin:3rem!important}.bootstrap .mt-xl-5,.bootstrap .my-xl-5{margin-top:3rem!important}.bootstrap .mr-xl-5,.bootstrap .mx-xl-5{margin-right:3rem!important}.bootstrap .mb-xl-5,.bootstrap .my-xl-5{margin-bottom:3rem!important}.bootstrap .ml-xl-5,.bootstrap .mx-xl-5{margin-left:3rem!important}.bootstrap .p-xl-0{padding:0!important}.bootstrap .pt-xl-0,.bootstrap .py-xl-0{padding-top:0!important}.bootstrap .pr-xl-0,.bootstrap .px-xl-0{padding-right:0!important}.bootstrap .pb-xl-0,.bootstrap .py-xl-0{padding-bottom:0!important}.bootstrap .pl-xl-0,.bootstrap .px-xl-0{padding-left:0!important}.bootstrap .p-xl-1{padding:.25rem!important}.bootstrap .pt-xl-1,.bootstrap .py-xl-1{padding-top:.25rem!important}.bootstrap .pr-xl-1,.bootstrap .px-xl-1{padding-right:.25rem!important}.bootstrap .pb-xl-1,.bootstrap .py-xl-1{padding-bottom:.25rem!important}.bootstrap .pl-xl-1,.bootstrap .px-xl-1{padding-left:.25rem!important}.bootstrap .p-xl-2{padding:.5rem!important}.bootstrap .pt-xl-2,.bootstrap .py-xl-2{padding-top:.5rem!important}.bootstrap .pr-xl-2,.bootstrap .px-xl-2{padding-right:.5rem!important}.bootstrap .pb-xl-2,.bootstrap .py-xl-2{padding-bottom:.5rem!important}.bootstrap .pl-xl-2,.bootstrap .px-xl-2{padding-left:.5rem!important}.bootstrap .p-xl-3{padding:1rem!important}.bootstrap .pt-xl-3,.bootstrap .py-xl-3{padding-top:1rem!important}.bootstrap .pr-xl-3,.bootstrap .px-xl-3{padding-right:1rem!important}.bootstrap .pb-xl-3,.bootstrap .py-xl-3{padding-bottom:1rem!important}.bootstrap .pl-xl-3,.bootstrap .px-xl-3{padding-left:1rem!important}.bootstrap .p-xl-4{padding:1.5rem!important}.bootstrap .pt-xl-4,.bootstrap .py-xl-4{padding-top:1.5rem!important}.bootstrap .pr-xl-4,.bootstrap .px-xl-4{padding-right:1.5rem!important}.bootstrap .pb-xl-4,.bootstrap .py-xl-4{padding-bottom:1.5rem!important}.bootstrap .pl-xl-4,.bootstrap .px-xl-4{padding-left:1.5rem!important}.bootstrap .p-xl-5{padding:3rem!important}.bootstrap .pt-xl-5,.bootstrap .py-xl-5{padding-top:3rem!important}.bootstrap .pr-xl-5,.bootstrap .px-xl-5{padding-right:3rem!important}.bootstrap .pb-xl-5,.bootstrap .py-xl-5{padding-bottom:3rem!important}.bootstrap .pl-xl-5,.bootstrap .px-xl-5{padding-left:3rem!important}.bootstrap .m-xl-n1{margin:-.25rem!important}.bootstrap .mt-xl-n1,.bootstrap .my-xl-n1{margin-top:-.25rem!important}.bootstrap .mr-xl-n1,.bootstrap .mx-xl-n1{margin-right:-.25rem!important}.bootstrap .mb-xl-n1,.bootstrap .my-xl-n1{margin-bottom:-.25rem!important}.bootstrap .ml-xl-n1,.bootstrap .mx-xl-n1{margin-left:-.25rem!important}.bootstrap .m-xl-n2{margin:-.5rem!important}.bootstrap .mt-xl-n2,.bootstrap .my-xl-n2{margin-top:-.5rem!important}.bootstrap .mr-xl-n2,.bootstrap .mx-xl-n2{margin-right:-.5rem!important}.bootstrap .mb-xl-n2,.bootstrap .my-xl-n2{margin-bottom:-.5rem!important}.bootstrap .ml-xl-n2,.bootstrap .mx-xl-n2{margin-left:-.5rem!important}.bootstrap .m-xl-n3{margin:-1rem!important}.bootstrap .mt-xl-n3,.bootstrap .my-xl-n3{margin-top:-1rem!important}.bootstrap .mr-xl-n3,.bootstrap .mx-xl-n3{margin-right:-1rem!important}.bootstrap .mb-xl-n3,.bootstrap .my-xl-n3{margin-bottom:-1rem!important}.bootstrap .ml-xl-n3,.bootstrap .mx-xl-n3{margin-left:-1rem!important}.bootstrap .m-xl-n4{margin:-1.5rem!important}.bootstrap .mt-xl-n4,.bootstrap .my-xl-n4{margin-top:-1.5rem!important}.bootstrap .mr-xl-n4,.bootstrap .mx-xl-n4{margin-right:-1.5rem!important}.bootstrap .mb-xl-n4,.bootstrap .my-xl-n4{margin-bottom:-1.5rem!important}.bootstrap .ml-xl-n4,.bootstrap .mx-xl-n4{margin-left:-1.5rem!important}.bootstrap .m-xl-n5{margin:-3rem!important}.bootstrap .mt-xl-n5,.bootstrap .my-xl-n5{margin-top:-3rem!important}.bootstrap .mr-xl-n5,.bootstrap .mx-xl-n5{margin-right:-3rem!important}.bootstrap .mb-xl-n5,.bootstrap .my-xl-n5{margin-bottom:-3rem!important}.bootstrap .ml-xl-n5,.bootstrap .mx-xl-n5{margin-left:-3rem!important}.bootstrap .m-xl-auto{margin:auto!important}.bootstrap .mt-xl-auto,.bootstrap .my-xl-auto{margin-top:auto!important}.bootstrap .mr-xl-auto,.bootstrap .mx-xl-auto{margin-right:auto!important}.bootstrap .mb-xl-auto,.bootstrap .my-xl-auto{margin-bottom:auto!important}.bootstrap .ml-xl-auto,.bootstrap .mx-xl-auto{margin-left:auto!important}}.bootstrap .stretched-link:after{background-color:#0000;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.bootstrap .text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.bootstrap .text-justify{text-align:justify!important}.bootstrap .text-wrap{white-space:normal!important}.bootstrap .text-nowrap{white-space:nowrap!important}.bootstrap .text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bootstrap .text-left{text-align:left!important}.bootstrap .text-right{text-align:right!important}.bootstrap .text-center{text-align:center!important}@media(min-width:576px){.bootstrap .text-sm-left{text-align:left!important}.bootstrap .text-sm-right{text-align:right!important}.bootstrap .text-sm-center{text-align:center!important}}@media(min-width:768px){.bootstrap .text-md-left{text-align:left!important}.bootstrap .text-md-right{text-align:right!important}.bootstrap .text-md-center{text-align:center!important}}@media(min-width:992px){.bootstrap .text-lg-left{text-align:left!important}.bootstrap .text-lg-right{text-align:right!important}.bootstrap .text-lg-center{text-align:center!important}}@media(min-width:1200px){.bootstrap .text-xl-left{text-align:left!important}.bootstrap .text-xl-right{text-align:right!important}.bootstrap .text-xl-center{text-align:center!important}}.bootstrap .text-lowercase{text-transform:lowercase!important}.bootstrap .text-uppercase{text-transform:uppercase!important}.bootstrap .text-capitalize{text-transform:capitalize!important}.bootstrap .font-weight-light{font-weight:300!important}.bootstrap .font-weight-lighter{font-weight:lighter!important}.bootstrap .font-weight-normal{font-weight:400!important}.bootstrap .font-weight-bold{font-weight:700!important}.bootstrap .font-weight-bolder{font-weight:bolder!important}.bootstrap .font-italic{font-style:italic!important}.bootstrap .text-white{color:#fff!important}.bootstrap .text-primary{color:#007bff!important}.bootstrap a.text-primary:focus,.bootstrap a.text-primary:hover{color:#0056b3!important}.bootstrap .text-secondary{color:#6c757d!important}.bootstrap a.text-secondary:focus,.bootstrap a.text-secondary:hover{color:#494f54!important}.bootstrap .text-success{color:#28a745!important}.bootstrap a.text-success:focus,.bootstrap a.text-success:hover{color:#19692c!important}.bootstrap .text-info{color:#17a2b8!important}.bootstrap a.text-info:focus,.bootstrap a.text-info:hover{color:#0f6674!important}.bootstrap .text-warning{color:#ffc107!important}.bootstrap a.text-warning:focus,.bootstrap a.text-warning:hover{color:#ba8b00!important}.bootstrap .text-danger{color:#dc3545!important}.bootstrap a.text-danger:focus,.bootstrap a.text-danger:hover{color:#a71d2a!important}.bootstrap .text-light{color:#f8f9fa!important}.bootstrap a.text-light:focus,.bootstrap a.text-light:hover{color:#cbd3da!important}.bootstrap .text-dark{color:#343a40!important}.bootstrap a.text-dark:focus,.bootstrap a.text-dark:hover{color:#121416!important}.bootstrap .text-body{color:#212529!important}.bootstrap .text-muted{color:#6c757d!important}.bootstrap .text-black-50{color:#00000080!important}.bootstrap .text-white-50{color:#ffffff80!important}.bootstrap .text-hide{background-color:initial;border:0;color:#0000;font:0/0 a;text-shadow:none}.bootstrap .text-decoration-none{text-decoration:none!important}.bootstrap .text-break{word-wrap:break-word!important;word-break:break-word!important}.bootstrap .text-reset{color:inherit!important}.bootstrap .visible{visibility:visible!important}.bootstrap .invisible{visibility:hidden!important}.bootstrap .alert-cell{background:#f5f5f5;color:inherit}.bootstrap .config-yaml,.bootstrap .rule-cell{background-color:#f5f5f5}.bootstrap .config-yaml{border:1px solid #ccc;border-radius:4px;color:#333;display:block;font-size:13px;padding:10px;word-break:break-all}.bootstrap .query-stats{color:#71808e;flex-grow:1;font-size:.7rem}.bootstrap .metrics-explorer.modal-dialog{max-width:750px;overflow-wrap:break-word}.bootstrap .metrics-explorer .metric{cursor:pointer;margin:0;padding:5px}.bootstrap .metrics-explorer .metric:hover{background:#efefef}.bootstrap button.metrics-explorer-btn{background-color:#e9ecef;border:1px solid #ced4da;color:#495057}.bootstrap .graph-controls button.clear-time-btn,.bootstrap .table-controls button.clear-time-btn{background-color:#fff;border:1px solid #ced4da;border-left:none}.bootstrap .graph-controls button.clear-time-btn:hover,.bootstrap .table-controls button.clear-time-btn:hover{color:#545b62}.bootstrap button.execute-btn{border:1px solid #006fe6;width:84px}.bootstrap .expression-input .cm-expression-input{border:1px solid #ced4da;flex:1 1 auto;font-size:15px;padding:4px 0 0 8px}.bootstrap .tab-content{border-bottom:1px solid #dee2e6;border-left:1px solid #dee2e6;border-right:1px solid #dee2e6;padding:10px}.bootstrap .modal.show{overflow-y:auto}.bootstrap .panel{margin-bottom:20px}.bootstrap input[type=checkbox]:checked+label{color:#286090}.bootstrap .custom-control-label{cursor:pointer}.bootstrap .togglers-wrapper .form-group{margin-bottom:.5rem}.bootstrap [for$=-toggler].custom-control-label:after,.bootstrap [for$=-toggler].custom-control-label:before{height:1.12rem;left:-1.3rem;top:.28rem;width:1.12rem}.bootstrap .capitalize-title:first-letter{text-transform:capitalize}.bootstrap .input-group.expression-input{flex-wrap:nowrap;margin-bottom:10px}.bootstrap .alert.alert-danger{margin-bottom:10px}.bootstrap .nav-tabs .nav-link{cursor:pointer}.bootstrap .tab-content .alert{margin-bottom:0}.bootstrap .data-table.table{margin:10px 0 2px}.bootstrap .data-table>tbody>tr>td{font-size:.8em;overflow:hidden;padding:5px 0 5px 8px}.bootstrap .autosuggest-dropdown{background-color:#fff;border:1px solid #ced4da;color:#495057;font-size:1rem;left:56px;margin-top:-6px;position:absolute;z-index:1000}.bootstrap .autosuggest-dropdown-list{list-style:none;margin:0;padding:0}.bootstrap .autosuggest-dropdown-list li{background-color:initial;border:0;clear:both;display:block;padding:.25rem 1.5rem;white-space:nowrap;width:100%}.bootstrap .autosuggest-dropdown-list li.autosuggest-dropdown-header{background-color:#bfdeff;font-size:10px;line-height:1.5;text-align:center;text-transform:uppercase}.bootstrap .graph-controls,.bootstrap .table-controls{margin-bottom:10px}.bootstrap .graph-controls input,.bootstrap .table-controls input{text-align:center}.bootstrap .graph-controls .range-input input{width:50px}.bootstrap .time-input input{border-right:none}.bootstrap .time-input{width:270px!important}.bootstrap .graph-controls input.resolution-input{width:90px}.bootstrap .graph-controls>:not(:first-child){margin-left:20px}.bootstrap .graph-legend{display:inline-block;font-size:.75em;margin:15px 0 15px 55px;padding:10px 5px}.bootstrap .legend-item{border-radius:3px;cursor:pointer;display:flex;line-height:1.7;padding:0 5px}.bootstrap .legend-item div{flex-wrap:wrap}.bootstrap .legend-swatch{display:inline-block;height:7px;margin:6px 8px 2px 0;min-width:7px;outline:1.5px solid #ccc;outline-offset:1px}.bootstrap .legend-item:hover{background:#0000002e}.bootstrap .legend-metric-name{margin-right:1px}.bootstrap .legend-label-name{font-weight:700}.bootstrap .graph{margin:0 5px}.bootstrap .graph-chart{fill:#495057;font-size:.8em;height:500px;width:100%}.bootstrap .graph-chart .flot-overlay{cursor:crosshair}.bootstrap .graph-tooltip{background:#000c;border-radius:3px;color:#fff;font-family:Arial,Helvetica,sans-serif;font-size:12px;padding:8px;white-space:nowrap}.bootstrap .graph-tooltip .labels{font-size:11px;line-height:11px}.bootstrap .graph-tooltip .detail-swatch{display:inline-block;height:10px;width:10px}.bootstrap .add-panel-btn{margin-bottom:20px}.bootstrap .target-head{font-size:large;font-weight:700}.bootstrap .group-info{display:flex;justify-content:space-between;margin-bottom:10px;padding:10px}.bootstrap .badges-wrapper>span{margin-right:5px;max-height:20px}.bootstrap .rules-head{font-weight:600}.bootstrap .rule_cell{background-color:#f5f5f5;display:block;font-family:monospace;white-space:pre-wrap}.bootstrap .popup-message{background-color:#000000b3;border-radius:4px;color:#fff;display:none;font-size:14px;margin-right:15px;max-width:250px;min-width:120px;padding:8px 12px;position:absolute;right:100%;top:50%;transform:translateY(-50%);white-space:normal;width:-webkit-max-content;width:max-content}.bootstrap .custom-control-label:hover .popup-message{display:block}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}body.bootstrap-dark{background-color:#191d21;color:#d3d3d3;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;font-weight:400;line-height:1.5;margin:0;text-align:left}body.bootstrap-dark button{color:#d3d3d3}.bootstrap-dark :root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.bootstrap-dark .h1,.bootstrap-dark .h2,.bootstrap-dark .h3,.bootstrap-dark .h4,.bootstrap-dark .h5,.bootstrap-dark .h6,.bootstrap-dark h1,.bootstrap-dark h2,.bootstrap-dark h3,.bootstrap-dark h4,.bootstrap-dark h5,.bootstrap-dark h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.bootstrap-dark .h1,.bootstrap-dark h1{font-size:2.5rem}.bootstrap-dark .h2,.bootstrap-dark h2{font-size:2rem}.bootstrap-dark .h3,.bootstrap-dark h3{font-size:1.75rem}.bootstrap-dark .h4,.bootstrap-dark h4{font-size:1.5rem}.bootstrap-dark .h5,.bootstrap-dark h5{font-size:1.25rem}.bootstrap-dark .h6,.bootstrap-dark h6{font-size:1rem}.bootstrap-dark .lead{font-size:1.25rem;font-weight:300}.bootstrap-dark .display-1{font-size:6rem;font-weight:300;line-height:1.2}.bootstrap-dark .display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.bootstrap-dark .display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.bootstrap-dark .display-4{font-size:3.5rem;font-weight:300;line-height:1.2}.bootstrap-dark hr{border:0;border-top:1px solid #ffffff1a;margin-bottom:1rem;margin-top:1rem}.bootstrap-dark .small,.bootstrap-dark small{font-size:80%;font-weight:400}.bootstrap-dark .mark,.bootstrap-dark mark{background-color:#fcf8e3;padding:.2em}.bootstrap-dark .list-inline,.bootstrap-dark .list-unstyled{list-style:none;padding-left:0}.bootstrap-dark .list-inline-item{display:inline-block}.bootstrap-dark .list-inline-item:not(:last-child){margin-right:.5rem}.bootstrap-dark .initialism{font-size:90%;text-transform:uppercase}.bootstrap-dark .blockquote{font-size:1.25rem;margin-bottom:1rem}.bootstrap-dark .blockquote-footer{color:#6c757d;display:block;font-size:80%}.bootstrap-dark .blockquote-footer:before{content:"— "}.bootstrap-dark .img-fluid{height:auto;max-width:100%}.bootstrap-dark .img-thumbnail{background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;height:auto;max-width:100%;padding:.25rem}.bootstrap-dark .figure{display:inline-block}.bootstrap-dark .figure-img{line-height:1;margin-bottom:.5rem}.bootstrap-dark .figure-caption{color:#6c757d;font-size:90%}.bootstrap-dark code{word-wrap:break-word;color:#e83e8c;font-size:87.5%}a>.bootstrap-dark code{color:inherit}.bootstrap-dark kbd{background-color:#212529;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}.bootstrap-dark kbd kbd{font-size:100%;font-weight:700;padding:0}.bootstrap-dark pre{color:#212529;display:block;font-size:87.5%}.bootstrap-dark pre code{color:inherit;font-size:inherit;word-break:normal}.bootstrap-dark .pre-scrollable{max-height:340px;overflow-y:scroll}.bootstrap-dark .container,.bootstrap-dark .container-fluid,.bootstrap-dark .container-lg,.bootstrap-dark .container-md,.bootstrap-dark .container-sm,.bootstrap-dark .container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media(min-width:576px){.bootstrap-dark .container,.bootstrap-dark .container-sm{max-width:540px}}@media(min-width:768px){.bootstrap-dark .container,.bootstrap-dark .container-md,.bootstrap-dark .container-sm{max-width:720px}}@media(min-width:992px){.bootstrap-dark .container,.bootstrap-dark .container-lg,.bootstrap-dark .container-md,.bootstrap-dark .container-sm{max-width:960px}}@media(min-width:1200px){.bootstrap-dark .container,.bootstrap-dark .container-lg,.bootstrap-dark .container-md,.bootstrap-dark .container-sm,.bootstrap-dark .container-xl{max-width:1140px}}.bootstrap-dark .row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.bootstrap-dark .no-gutters{margin-left:0;margin-right:0}.bootstrap-dark .no-gutters>.col,.bootstrap-dark .no-gutters>[class*=col-]{padding-left:0;padding-right:0}.bootstrap-dark .col,.bootstrap-dark .col-1,.bootstrap-dark .col-10,.bootstrap-dark .col-11,.bootstrap-dark .col-12,.bootstrap-dark .col-2,.bootstrap-dark .col-3,.bootstrap-dark .col-4,.bootstrap-dark .col-5,.bootstrap-dark .col-6,.bootstrap-dark .col-7,.bootstrap-dark .col-8,.bootstrap-dark .col-9,.bootstrap-dark .col-auto,.bootstrap-dark .col-lg,.bootstrap-dark .col-lg-1,.bootstrap-dark .col-lg-10,.bootstrap-dark .col-lg-11,.bootstrap-dark .col-lg-12,.bootstrap-dark .col-lg-2,.bootstrap-dark .col-lg-3,.bootstrap-dark .col-lg-4,.bootstrap-dark .col-lg-5,.bootstrap-dark .col-lg-6,.bootstrap-dark .col-lg-7,.bootstrap-dark .col-lg-8,.bootstrap-dark .col-lg-9,.bootstrap-dark .col-lg-auto,.bootstrap-dark .col-md,.bootstrap-dark .col-md-1,.bootstrap-dark .col-md-10,.bootstrap-dark .col-md-11,.bootstrap-dark .col-md-12,.bootstrap-dark .col-md-2,.bootstrap-dark .col-md-3,.bootstrap-dark .col-md-4,.bootstrap-dark .col-md-5,.bootstrap-dark .col-md-6,.bootstrap-dark .col-md-7,.bootstrap-dark .col-md-8,.bootstrap-dark .col-md-9,.bootstrap-dark .col-md-auto,.bootstrap-dark .col-sm,.bootstrap-dark .col-sm-1,.bootstrap-dark .col-sm-10,.bootstrap-dark .col-sm-11,.bootstrap-dark .col-sm-12,.bootstrap-dark .col-sm-2,.bootstrap-dark .col-sm-3,.bootstrap-dark .col-sm-4,.bootstrap-dark .col-sm-5,.bootstrap-dark .col-sm-6,.bootstrap-dark .col-sm-7,.bootstrap-dark .col-sm-8,.bootstrap-dark .col-sm-9,.bootstrap-dark .col-sm-auto,.bootstrap-dark .col-xl,.bootstrap-dark .col-xl-1,.bootstrap-dark .col-xl-10,.bootstrap-dark .col-xl-11,.bootstrap-dark .col-xl-12,.bootstrap-dark .col-xl-2,.bootstrap-dark .col-xl-3,.bootstrap-dark .col-xl-4,.bootstrap-dark .col-xl-5,.bootstrap-dark .col-xl-6,.bootstrap-dark .col-xl-7,.bootstrap-dark .col-xl-8,.bootstrap-dark .col-xl-9,.bootstrap-dark .col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.bootstrap-dark .col{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap-dark .row-cols-1>*{flex:0 0 100%;max-width:100%}.bootstrap-dark .row-cols-2>*{flex:0 0 50%;max-width:50%}.bootstrap-dark .row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap-dark .row-cols-4>*{flex:0 0 25%;max-width:25%}.bootstrap-dark .row-cols-5>*{flex:0 0 20%;max-width:20%}.bootstrap-dark .row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap-dark .col-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap-dark .col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap-dark .col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap-dark .col-3{flex:0 0 25%;max-width:25%}.bootstrap-dark .col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap-dark .col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap-dark .col-6{flex:0 0 50%;max-width:50%}.bootstrap-dark .col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap-dark .col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap-dark .col-9{flex:0 0 75%;max-width:75%}.bootstrap-dark .col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap-dark .col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap-dark .col-12{flex:0 0 100%;max-width:100%}.bootstrap-dark .order-first{order:-1}.bootstrap-dark .order-last{order:13}.bootstrap-dark .order-0{order:0}.bootstrap-dark .order-1{order:1}.bootstrap-dark .order-2{order:2}.bootstrap-dark .order-3{order:3}.bootstrap-dark .order-4{order:4}.bootstrap-dark .order-5{order:5}.bootstrap-dark .order-6{order:6}.bootstrap-dark .order-7{order:7}.bootstrap-dark .order-8{order:8}.bootstrap-dark .order-9{order:9}.bootstrap-dark .order-10{order:10}.bootstrap-dark .order-11{order:11}.bootstrap-dark .order-12{order:12}.bootstrap-dark .offset-1{margin-left:8.33333333%}.bootstrap-dark .offset-2{margin-left:16.66666667%}.bootstrap-dark .offset-3{margin-left:25%}.bootstrap-dark .offset-4{margin-left:33.33333333%}.bootstrap-dark .offset-5{margin-left:41.66666667%}.bootstrap-dark .offset-6{margin-left:50%}.bootstrap-dark .offset-7{margin-left:58.33333333%}.bootstrap-dark .offset-8{margin-left:66.66666667%}.bootstrap-dark .offset-9{margin-left:75%}.bootstrap-dark .offset-10{margin-left:83.33333333%}.bootstrap-dark .offset-11{margin-left:91.66666667%}@media(min-width:576px){.bootstrap-dark .col-sm{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap-dark .row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.bootstrap-dark .row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.bootstrap-dark .row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap-dark .row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.bootstrap-dark .row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.bootstrap-dark .row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap-dark .col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap-dark .col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap-dark .col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap-dark .col-sm-3{flex:0 0 25%;max-width:25%}.bootstrap-dark .col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap-dark .col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap-dark .col-sm-6{flex:0 0 50%;max-width:50%}.bootstrap-dark .col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap-dark .col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap-dark .col-sm-9{flex:0 0 75%;max-width:75%}.bootstrap-dark .col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap-dark .col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap-dark .col-sm-12{flex:0 0 100%;max-width:100%}.bootstrap-dark .order-sm-first{order:-1}.bootstrap-dark .order-sm-last{order:13}.bootstrap-dark .order-sm-0{order:0}.bootstrap-dark .order-sm-1{order:1}.bootstrap-dark .order-sm-2{order:2}.bootstrap-dark .order-sm-3{order:3}.bootstrap-dark .order-sm-4{order:4}.bootstrap-dark .order-sm-5{order:5}.bootstrap-dark .order-sm-6{order:6}.bootstrap-dark .order-sm-7{order:7}.bootstrap-dark .order-sm-8{order:8}.bootstrap-dark .order-sm-9{order:9}.bootstrap-dark .order-sm-10{order:10}.bootstrap-dark .order-sm-11{order:11}.bootstrap-dark .order-sm-12{order:12}.bootstrap-dark .offset-sm-0{margin-left:0}.bootstrap-dark .offset-sm-1{margin-left:8.33333333%}.bootstrap-dark .offset-sm-2{margin-left:16.66666667%}.bootstrap-dark .offset-sm-3{margin-left:25%}.bootstrap-dark .offset-sm-4{margin-left:33.33333333%}.bootstrap-dark .offset-sm-5{margin-left:41.66666667%}.bootstrap-dark .offset-sm-6{margin-left:50%}.bootstrap-dark .offset-sm-7{margin-left:58.33333333%}.bootstrap-dark .offset-sm-8{margin-left:66.66666667%}.bootstrap-dark .offset-sm-9{margin-left:75%}.bootstrap-dark .offset-sm-10{margin-left:83.33333333%}.bootstrap-dark .offset-sm-11{margin-left:91.66666667%}}@media(min-width:768px){.bootstrap-dark .col-md{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap-dark .row-cols-md-1>*{flex:0 0 100%;max-width:100%}.bootstrap-dark .row-cols-md-2>*{flex:0 0 50%;max-width:50%}.bootstrap-dark .row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap-dark .row-cols-md-4>*{flex:0 0 25%;max-width:25%}.bootstrap-dark .row-cols-md-5>*{flex:0 0 20%;max-width:20%}.bootstrap-dark .row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap-dark .col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap-dark .col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap-dark .col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap-dark .col-md-3{flex:0 0 25%;max-width:25%}.bootstrap-dark .col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap-dark .col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap-dark .col-md-6{flex:0 0 50%;max-width:50%}.bootstrap-dark .col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap-dark .col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap-dark .col-md-9{flex:0 0 75%;max-width:75%}.bootstrap-dark .col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap-dark .col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap-dark .col-md-12{flex:0 0 100%;max-width:100%}.bootstrap-dark .order-md-first{order:-1}.bootstrap-dark .order-md-last{order:13}.bootstrap-dark .order-md-0{order:0}.bootstrap-dark .order-md-1{order:1}.bootstrap-dark .order-md-2{order:2}.bootstrap-dark .order-md-3{order:3}.bootstrap-dark .order-md-4{order:4}.bootstrap-dark .order-md-5{order:5}.bootstrap-dark .order-md-6{order:6}.bootstrap-dark .order-md-7{order:7}.bootstrap-dark .order-md-8{order:8}.bootstrap-dark .order-md-9{order:9}.bootstrap-dark .order-md-10{order:10}.bootstrap-dark .order-md-11{order:11}.bootstrap-dark .order-md-12{order:12}.bootstrap-dark .offset-md-0{margin-left:0}.bootstrap-dark .offset-md-1{margin-left:8.33333333%}.bootstrap-dark .offset-md-2{margin-left:16.66666667%}.bootstrap-dark .offset-md-3{margin-left:25%}.bootstrap-dark .offset-md-4{margin-left:33.33333333%}.bootstrap-dark .offset-md-5{margin-left:41.66666667%}.bootstrap-dark .offset-md-6{margin-left:50%}.bootstrap-dark .offset-md-7{margin-left:58.33333333%}.bootstrap-dark .offset-md-8{margin-left:66.66666667%}.bootstrap-dark .offset-md-9{margin-left:75%}.bootstrap-dark .offset-md-10{margin-left:83.33333333%}.bootstrap-dark .offset-md-11{margin-left:91.66666667%}}@media(min-width:992px){.bootstrap-dark .col-lg{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap-dark .row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.bootstrap-dark .row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.bootstrap-dark .row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap-dark .row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.bootstrap-dark .row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.bootstrap-dark .row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap-dark .col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap-dark .col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap-dark .col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap-dark .col-lg-3{flex:0 0 25%;max-width:25%}.bootstrap-dark .col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap-dark .col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap-dark .col-lg-6{flex:0 0 50%;max-width:50%}.bootstrap-dark .col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap-dark .col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap-dark .col-lg-9{flex:0 0 75%;max-width:75%}.bootstrap-dark .col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap-dark .col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap-dark .col-lg-12{flex:0 0 100%;max-width:100%}.bootstrap-dark .order-lg-first{order:-1}.bootstrap-dark .order-lg-last{order:13}.bootstrap-dark .order-lg-0{order:0}.bootstrap-dark .order-lg-1{order:1}.bootstrap-dark .order-lg-2{order:2}.bootstrap-dark .order-lg-3{order:3}.bootstrap-dark .order-lg-4{order:4}.bootstrap-dark .order-lg-5{order:5}.bootstrap-dark .order-lg-6{order:6}.bootstrap-dark .order-lg-7{order:7}.bootstrap-dark .order-lg-8{order:8}.bootstrap-dark .order-lg-9{order:9}.bootstrap-dark .order-lg-10{order:10}.bootstrap-dark .order-lg-11{order:11}.bootstrap-dark .order-lg-12{order:12}.bootstrap-dark .offset-lg-0{margin-left:0}.bootstrap-dark .offset-lg-1{margin-left:8.33333333%}.bootstrap-dark .offset-lg-2{margin-left:16.66666667%}.bootstrap-dark .offset-lg-3{margin-left:25%}.bootstrap-dark .offset-lg-4{margin-left:33.33333333%}.bootstrap-dark .offset-lg-5{margin-left:41.66666667%}.bootstrap-dark .offset-lg-6{margin-left:50%}.bootstrap-dark .offset-lg-7{margin-left:58.33333333%}.bootstrap-dark .offset-lg-8{margin-left:66.66666667%}.bootstrap-dark .offset-lg-9{margin-left:75%}.bootstrap-dark .offset-lg-10{margin-left:83.33333333%}.bootstrap-dark .offset-lg-11{margin-left:91.66666667%}}@media(min-width:1200px){.bootstrap-dark .col-xl{flex-basis:0;flex-grow:1;max-width:100%}.bootstrap-dark .row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.bootstrap-dark .row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.bootstrap-dark .row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.bootstrap-dark .row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.bootstrap-dark .row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.bootstrap-dark .row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.bootstrap-dark .col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.bootstrap-dark .col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.bootstrap-dark .col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.bootstrap-dark .col-xl-3{flex:0 0 25%;max-width:25%}.bootstrap-dark .col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.bootstrap-dark .col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.bootstrap-dark .col-xl-6{flex:0 0 50%;max-width:50%}.bootstrap-dark .col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.bootstrap-dark .col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.bootstrap-dark .col-xl-9{flex:0 0 75%;max-width:75%}.bootstrap-dark .col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.bootstrap-dark .col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.bootstrap-dark .col-xl-12{flex:0 0 100%;max-width:100%}.bootstrap-dark .order-xl-first{order:-1}.bootstrap-dark .order-xl-last{order:13}.bootstrap-dark .order-xl-0{order:0}.bootstrap-dark .order-xl-1{order:1}.bootstrap-dark .order-xl-2{order:2}.bootstrap-dark .order-xl-3{order:3}.bootstrap-dark .order-xl-4{order:4}.bootstrap-dark .order-xl-5{order:5}.bootstrap-dark .order-xl-6{order:6}.bootstrap-dark .order-xl-7{order:7}.bootstrap-dark .order-xl-8{order:8}.bootstrap-dark .order-xl-9{order:9}.bootstrap-dark .order-xl-10{order:10}.bootstrap-dark .order-xl-11{order:11}.bootstrap-dark .order-xl-12{order:12}.bootstrap-dark .offset-xl-0{margin-left:0}.bootstrap-dark .offset-xl-1{margin-left:8.33333333%}.bootstrap-dark .offset-xl-2{margin-left:16.66666667%}.bootstrap-dark .offset-xl-3{margin-left:25%}.bootstrap-dark .offset-xl-4{margin-left:33.33333333%}.bootstrap-dark .offset-xl-5{margin-left:41.66666667%}.bootstrap-dark .offset-xl-6{margin-left:50%}.bootstrap-dark .offset-xl-7{margin-left:58.33333333%}.bootstrap-dark .offset-xl-8{margin-left:66.66666667%}.bootstrap-dark .offset-xl-9{margin-left:75%}.bootstrap-dark .offset-xl-10{margin-left:83.33333333%}.bootstrap-dark .offset-xl-11{margin-left:91.66666667%}}.bootstrap-dark .table{color:#d3d3d3;margin-bottom:1rem;width:100%}.bootstrap-dark .table td,.bootstrap-dark .table th{border-top:1px solid #343a40;padding:.75rem;vertical-align:top}.bootstrap-dark .table thead th{border-bottom:2px solid #343a40;vertical-align:bottom}.bootstrap-dark .table tbody+tbody{border-top:2px solid #343a40}.bootstrap-dark .table-sm td,.bootstrap-dark .table-sm th{padding:.3rem}.bootstrap-dark .table-bordered,.bootstrap-dark .table-bordered td,.bootstrap-dark .table-bordered th{border:1px solid #343a40}.bootstrap-dark .table-bordered thead td,.bootstrap-dark .table-bordered thead th{border-bottom-width:2px}.bootstrap-dark .table-borderless tbody+tbody,.bootstrap-dark .table-borderless td,.bootstrap-dark .table-borderless th,.bootstrap-dark .table-borderless thead th{border:0}.bootstrap-dark .table-striped tbody tr:nth-of-type(odd){background-color:#0000000d}.bootstrap-dark .table-hover tbody tr:hover{background-color:rgba(0,0,0,.075);color:#d3d3d3}.bootstrap-dark .table-primary,.bootstrap-dark .table-primary>td,.bootstrap-dark .table-primary>th{background-color:#b8daff}.bootstrap-dark .table-primary tbody+tbody,.bootstrap-dark .table-primary td,.bootstrap-dark .table-primary th,.bootstrap-dark .table-primary thead th{border-color:#7abaff}.bootstrap-dark .table-hover .table-primary:hover,.bootstrap-dark .table-hover .table-primary:hover>td,.bootstrap-dark .table-hover .table-primary:hover>th{background-color:#9fcdff}.bootstrap-dark .table-secondary,.bootstrap-dark .table-secondary>td,.bootstrap-dark .table-secondary>th{background-color:#d6d8db}.bootstrap-dark .table-secondary tbody+tbody,.bootstrap-dark .table-secondary td,.bootstrap-dark .table-secondary th,.bootstrap-dark .table-secondary thead th{border-color:#b3b7bb}.bootstrap-dark .table-hover .table-secondary:hover,.bootstrap-dark .table-hover .table-secondary:hover>td,.bootstrap-dark .table-hover .table-secondary:hover>th{background-color:#c8cbcf}.bootstrap-dark .table-success,.bootstrap-dark .table-success>td,.bootstrap-dark .table-success>th{background-color:#c3e6cb}.bootstrap-dark .table-success tbody+tbody,.bootstrap-dark .table-success td,.bootstrap-dark .table-success th,.bootstrap-dark .table-success thead th{border-color:#8fd19e}.bootstrap-dark .table-hover .table-success:hover,.bootstrap-dark .table-hover .table-success:hover>td,.bootstrap-dark .table-hover .table-success:hover>th{background-color:#b1dfbb}.bootstrap-dark .table-info,.bootstrap-dark .table-info>td,.bootstrap-dark .table-info>th{background-color:#bee5eb}.bootstrap-dark .table-info tbody+tbody,.bootstrap-dark .table-info td,.bootstrap-dark .table-info th,.bootstrap-dark .table-info thead th{border-color:#86cfda}.bootstrap-dark .table-hover .table-info:hover,.bootstrap-dark .table-hover .table-info:hover>td,.bootstrap-dark .table-hover .table-info:hover>th{background-color:#abdde5}.bootstrap-dark .table-warning,.bootstrap-dark .table-warning>td,.bootstrap-dark .table-warning>th{background-color:#ffeeba}.bootstrap-dark .table-warning tbody+tbody,.bootstrap-dark .table-warning td,.bootstrap-dark .table-warning th,.bootstrap-dark .table-warning thead th{border-color:#ffdf7e}.bootstrap-dark .table-hover .table-warning:hover,.bootstrap-dark .table-hover .table-warning:hover>td,.bootstrap-dark .table-hover .table-warning:hover>th{background-color:#ffe8a1}.bootstrap-dark .table-danger,.bootstrap-dark .table-danger>td,.bootstrap-dark .table-danger>th{background-color:#f5c6cb}.bootstrap-dark .table-danger tbody+tbody,.bootstrap-dark .table-danger td,.bootstrap-dark .table-danger th,.bootstrap-dark .table-danger thead th{border-color:#ed969e}.bootstrap-dark .table-hover .table-danger:hover,.bootstrap-dark .table-hover .table-danger:hover>td,.bootstrap-dark .table-hover .table-danger:hover>th{background-color:#f1b0b7}.bootstrap-dark .table-light,.bootstrap-dark .table-light>td,.bootstrap-dark .table-light>th{background-color:#fdfdfe}.bootstrap-dark .table-light tbody+tbody,.bootstrap-dark .table-light td,.bootstrap-dark .table-light th,.bootstrap-dark .table-light thead th{border-color:#fbfcfc}.bootstrap-dark .table-hover .table-light:hover,.bootstrap-dark .table-hover .table-light:hover>td,.bootstrap-dark .table-hover .table-light:hover>th{background-color:#ececf6}.bootstrap-dark .table-dark,.bootstrap-dark .table-dark>td,.bootstrap-dark .table-dark>th{background-color:#c6c8ca}.bootstrap-dark .table-dark tbody+tbody,.bootstrap-dark .table-dark td,.bootstrap-dark .table-dark th,.bootstrap-dark .table-dark thead th{border-color:#95999c}.bootstrap-dark .table-hover .table-dark:hover,.bootstrap-dark .table-hover .table-dark:hover>td,.bootstrap-dark .table-hover .table-dark:hover>th{background-color:#b9bbbe}.bootstrap-dark .table-active,.bootstrap-dark .table-active>td,.bootstrap-dark .table-active>th,.bootstrap-dark .table-hover .table-active:hover,.bootstrap-dark .table-hover .table-active:hover>td,.bootstrap-dark .table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.bootstrap-dark .table .thead-dark th{background-color:#343a40;border-color:#454d55;color:#dee2e6}.bootstrap-dark .table .thead-light th{background-color:#e9ecef;border-color:#343a40;color:#495057}.bootstrap-dark .table-dark{background-color:#343a40}.bootstrap-dark .table-dark td,.bootstrap-dark .table-dark th,.bootstrap-dark .table-dark thead th{border-color:#454d55}.bootstrap-dark .table-dark.table-bordered{border:0}.bootstrap-dark .table-dark.table-striped tbody tr:nth-of-type(odd){background-color:#ffffff0d}.bootstrap-dark .table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media(max-width:575.98px){.bootstrap-dark .table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap-dark .table-responsive-sm>.table-bordered{border:0}}@media(max-width:767.98px){.bootstrap-dark .table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap-dark .table-responsive-md>.table-bordered{border:0}}@media(max-width:991.98px){.bootstrap-dark .table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap-dark .table-responsive-lg>.table-bordered{border:0}}@media(max-width:1199.98px){.bootstrap-dark .table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap-dark .table-responsive-xl>.table-bordered{border:0}}.bootstrap-dark .table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.bootstrap-dark .table-responsive>.table-bordered{border:0}.bootstrap-dark .table-danger,.bootstrap-dark .table-danger>td,.bootstrap-dark .table-danger>th,.bootstrap-dark .table-dark,.bootstrap-dark .table-dark>td,.bootstrap-dark .table-dark>th,.bootstrap-dark .table-hover .table-danger:hover,.bootstrap-dark .table-hover .table-danger:hover>td,.bootstrap-dark .table-hover .table-danger:hover>th,.bootstrap-dark .table-hover .table-dark:hover,.bootstrap-dark .table-hover .table-dark:hover>td,.bootstrap-dark .table-hover .table-dark:hover>th,.bootstrap-dark .table-hover .table-info:hover,.bootstrap-dark .table-hover .table-info:hover>td,.bootstrap-dark .table-hover .table-info:hover>th,.bootstrap-dark .table-hover .table-light:hover,.bootstrap-dark .table-hover .table-light:hover>td,.bootstrap-dark .table-hover .table-light:hover>th,.bootstrap-dark .table-hover .table-primary:hover,.bootstrap-dark .table-hover .table-primary:hover>td,.bootstrap-dark .table-hover .table-primary:hover>th,.bootstrap-dark .table-hover .table-secondary:hover,.bootstrap-dark .table-hover .table-secondary:hover>td,.bootstrap-dark .table-hover .table-secondary:hover>th,.bootstrap-dark .table-hover .table-success:hover,.bootstrap-dark .table-hover .table-success:hover>td,.bootstrap-dark .table-hover .table-success:hover>th,.bootstrap-dark .table-hover .table-warning:hover,.bootstrap-dark .table-hover .table-warning:hover>td,.bootstrap-dark .table-hover .table-warning:hover>th,.bootstrap-dark .table-info,.bootstrap-dark .table-info>td,.bootstrap-dark .table-info>th,.bootstrap-dark .table-light,.bootstrap-dark .table-light>td,.bootstrap-dark .table-light>th,.bootstrap-dark .table-primary,.bootstrap-dark .table-primary>td,.bootstrap-dark .table-primary>th,.bootstrap-dark .table-secondary,.bootstrap-dark .table-secondary>td,.bootstrap-dark .table-secondary>th,.bootstrap-dark .table-success,.bootstrap-dark .table-success>td,.bootstrap-dark .table-success>th,.bootstrap-dark .table-warning,.bootstrap-dark .table-warning>td,.bootstrap-dark .table-warning>th{color:#212529}.bootstrap-dark .table-active,.bootstrap-dark .table-active>td,.bootstrap-dark .table-active>th,.bootstrap-dark .table-hover .table-active:hover,.bootstrap-dark .table-hover .table-active:hover>td,.bootstrap-dark .table-hover .table-active:hover>th{color:#ced4da}.bootstrap-dark .table-dark{color:#dee2e6}.bootstrap-dark .form-control{background-clip:padding-box;background-color:#000;border:1px solid #6c757d;border-radius:.25rem;color:#dee2e6;display:block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.bootstrap-dark .form-control{transition:none}}.bootstrap-dark .form-control::-ms-expand{background-color:initial;border:0}.bootstrap-dark .form-control:focus{background-color:#191d21;border-color:#b3d7ff;box-shadow:0 0 0 .2rem #007bff40;color:#dee2e6;outline:0}.bootstrap-dark .form-control::placeholder{color:#6c757d;opacity:1}.bootstrap-dark .form-control:disabled,.bootstrap-dark .form-control[readonly]{background-color:#343a40;opacity:1}.bootstrap-dark input[type=date].form-control,.bootstrap-dark input[type=datetime-local].form-control,.bootstrap-dark input[type=month].form-control,.bootstrap-dark input[type=time].form-control{-webkit-appearance:none;appearance:none}.bootstrap-dark select.form-control:-moz-focusring{color:#0000;text-shadow:0 0 0 #dee2e6}.bootstrap-dark select.form-control:focus::-ms-value{background-color:#000;color:#dee2e6}.bootstrap-dark .form-control-file,.bootstrap-dark .form-control-range{display:block;width:100%}.bootstrap-dark .col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.bootstrap-dark .col-form-label-lg{font-size:1.25rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.bootstrap-dark .col-form-label-sm{font-size:.875rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.bootstrap-dark .form-control-plaintext{background-color:initial;border:solid #0000;border-width:1px 0;color:#212529;display:block;font-size:1rem;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.bootstrap-dark .form-control-plaintext.form-control-lg,.bootstrap-dark .form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.bootstrap-dark .form-control-sm{border-radius:.2rem;font-size:.875rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.bootstrap-dark .form-control-lg{border-radius:.3rem;font-size:1.25rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}.bootstrap-dark select.form-control[multiple],.bootstrap-dark select.form-control[size],.bootstrap-dark textarea.form-control{height:auto}.bootstrap-dark .form-group{margin-bottom:1rem}.bootstrap-dark .form-text{display:block;margin-top:.25rem}.bootstrap-dark .form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.bootstrap-dark .form-row>.col,.bootstrap-dark .form-row>[class*=col-]{padding-left:5px;padding-right:5px}.bootstrap-dark .form-check{display:block;padding-left:1.25rem;position:relative}.bootstrap-dark .form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.bootstrap-dark .form-check-input:disabled~.form-check-label,.bootstrap-dark .form-check-input[disabled]~.form-check-label{color:#6c757d}.bootstrap-dark .form-check-label{margin-bottom:0}.bootstrap-dark .form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.bootstrap-dark .form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.bootstrap-dark .valid-feedback{color:#28a745;display:none;font-size:80%;margin-top:.25rem;width:100%}.bootstrap-dark .valid-tooltip{background-color:#28a745e6;border-radius:.25rem;color:#ced4da;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.bootstrap-dark .valid-tooltip,.form-row>[class*=col-]>.bootstrap-dark .valid-tooltip{left:5px}.bootstrap-dark .is-valid~.valid-feedback,.bootstrap-dark .is-valid~.valid-tooltip{display:block}.bootstrap-dark .form-control.is-valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#28a745;padding-right:calc(1.5em + .75rem)!important}.bootstrap-dark .form-control.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap-dark select.form-control.is-valid{background-position:right 1.5rem center;padding-right:3rem!important}.bootstrap-dark textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.bootstrap-dark .custom-select.is-valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#000 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important}.bootstrap-dark .custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap-dark .form-check-input.is-valid~.form-check-label{color:#28a745}.bootstrap-dark .form-check-input.is-valid~.valid-feedback,.bootstrap-dark .form-check-input.is-valid~.valid-tooltip{display:block}.bootstrap-dark .custom-control-input.is-valid~.custom-control-label{color:#28a745}.bootstrap-dark .custom-control-input.is-valid~.custom-control-label:before{border-color:#28a745}.bootstrap-dark .custom-control-input.is-valid:checked~.custom-control-label:before{background-color:#34ce57;border-color:#34ce57}.bootstrap-dark .custom-control-input.is-valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #28a74540}.bootstrap-dark .custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.bootstrap-dark .custom-file-input.is-valid~.custom-file-label{border-color:#28a745}.bootstrap-dark .custom-file-input.is-valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap-dark .invalid-feedback{color:#dc3545;display:none;font-size:80%;margin-top:.25rem;width:100%}.bootstrap-dark .invalid-tooltip{background-color:#dc3545e6;border-radius:.25rem;color:#ced4da;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.bootstrap-dark .invalid-tooltip,.form-row>[class*=col-]>.bootstrap-dark .invalid-tooltip{left:5px}.bootstrap-dark .is-invalid~.invalid-feedback,.bootstrap-dark .is-invalid~.invalid-tooltip{display:block}.bootstrap-dark .form-control.is-invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important}.bootstrap-dark .form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap-dark select.form-control.is-invalid{background-position:right 1.5rem center;padding-right:3rem!important}.bootstrap-dark textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.bootstrap-dark .custom-select.is-invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#000 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important}.bootstrap-dark .custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap-dark .form-check-input.is-invalid~.form-check-label{color:#dc3545}.bootstrap-dark .form-check-input.is-invalid~.invalid-feedback,.bootstrap-dark .form-check-input.is-invalid~.invalid-tooltip{display:block}.bootstrap-dark .custom-control-input.is-invalid~.custom-control-label{color:#dc3545}.bootstrap-dark .custom-control-input.is-invalid~.custom-control-label:before{border-color:#dc3545}.bootstrap-dark .custom-control-input.is-invalid:checked~.custom-control-label:before{background-color:#e4606d;border-color:#e4606d}.bootstrap-dark .custom-control-input.is-invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #dc354540}.bootstrap-dark .custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.bootstrap-dark .custom-file-input.is-invalid~.custom-file-label{border-color:#dc3545}.bootstrap-dark .custom-file-input.is-invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap-dark .form-inline{align-items:center;display:flex;flex-flow:row wrap}.bootstrap-dark .form-inline .form-check{width:100%}@media(min-width:576px){.bootstrap-dark .form-inline label{align-items:center;display:flex;justify-content:center;margin-bottom:0}.bootstrap-dark .form-inline .form-group{align-items:center;display:flex;flex:0 0 auto;flex-flow:row wrap;margin-bottom:0}.bootstrap-dark .form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.bootstrap-dark .form-inline .form-control-plaintext{display:inline-block}.bootstrap-dark .form-inline .custom-select,.bootstrap-dark .form-inline .input-group{width:auto}.bootstrap-dark .form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.bootstrap-dark .form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.bootstrap-dark .form-inline .custom-control{align-items:center;justify-content:center}.bootstrap-dark .form-inline .custom-control-label{margin-bottom:0}}.bootstrap-dark .was-validated .valid-feedback{color:#28a745;display:none;font-size:80%;margin-top:.25rem;width:100%}.bootstrap-dark .was-validated .valid-tooltip{background-color:#28a745e6;border-radius:.25rem;color:#ced4da;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.bootstrap-dark .was-validated .valid-tooltip,.form-row>[class*=col-]>.bootstrap-dark .was-validated .valid-tooltip{left:5px}.bootstrap-dark .was-validated.is-valid~.valid-feedback,.bootstrap-dark .was-validated.is-valid~.valid-tooltip,.bootstrap-dark .was-validated:valid~.valid-feedback,.bootstrap-dark .was-validated:valid~.valid-tooltip{display:block}.bootstrap-dark .was-validated .form-control.is-valid,.bootstrap-dark .was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#28a745;padding-right:calc(1.5em + .75rem)!important}.bootstrap-dark .was-validated .form-control.is-valid:focus,.bootstrap-dark .was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap-dark .was-validated select.form-control.is-valid,.bootstrap-dark .was-validated select.form-control:valid{background-position:right 1.5rem center;padding-right:3rem!important}.bootstrap-dark .was-validated textarea.form-control.is-valid,.bootstrap-dark .was-validated textarea.form-control:valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.bootstrap-dark .was-validated .custom-select.is-valid,.bootstrap-dark .was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#000 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#28a745;padding-right:calc(.75em + 2.3125rem)!important}.bootstrap-dark .was-validated .custom-select.is-valid:focus,.bootstrap-dark .was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap-dark .was-validated .form-check-input.is-valid~.form-check-label,.bootstrap-dark .was-validated .form-check-input:valid~.form-check-label{color:#28a745}.bootstrap-dark .was-validated .form-check-input.is-valid~.valid-feedback,.bootstrap-dark .was-validated .form-check-input.is-valid~.valid-tooltip,.bootstrap-dark .was-validated .form-check-input:valid~.valid-feedback,.bootstrap-dark .was-validated .form-check-input:valid~.valid-tooltip{display:block}.bootstrap-dark .was-validated .custom-control-input.is-valid~.custom-control-label,.bootstrap-dark .was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.bootstrap-dark .was-validated .custom-control-input.is-valid~.custom-control-label:before,.bootstrap-dark .was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.bootstrap-dark .was-validated .custom-control-input.is-valid:checked~.custom-control-label:before,.bootstrap-dark .was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#34ce57;border-color:#34ce57}.bootstrap-dark .was-validated .custom-control-input.is-valid:focus~.custom-control-label:before,.bootstrap-dark .was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #28a74540}.bootstrap-dark .was-validated .custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.bootstrap-dark .was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.bootstrap-dark .was-validated .custom-file-input.is-valid~.custom-file-label,.bootstrap-dark .was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.bootstrap-dark .was-validated .custom-file-input.is-valid:focus~.custom-file-label,.bootstrap-dark .was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem #28a74540}.bootstrap-dark .was-validated .is-valid~.valid-feedback,.bootstrap-dark .was-validated .is-valid~.valid-tooltip,.bootstrap-dark .was-validated :valid~.valid-feedback,.bootstrap-dark .was-validated :valid~.valid-tooltip{display:block}.bootstrap-dark .was-validated .invalid-feedback{color:#dc3545;display:none;font-size:80%;margin-top:.25rem;width:100%}.bootstrap-dark .was-validated .invalid-tooltip{background-color:#dc3545e6;border-radius:.25rem;color:#ced4da;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.bootstrap-dark .was-validated .invalid-tooltip,.form-row>[class*=col-]>.bootstrap-dark .was-validated .invalid-tooltip{left:5px}.bootstrap-dark .was-validated.is-invalid~.invalid-feedback,.bootstrap-dark .was-validated.is-invalid~.invalid-tooltip,.bootstrap-dark .was-validated:invalid~.invalid-feedback,.bootstrap-dark .was-validated:invalid~.invalid-tooltip{display:block}.bootstrap-dark .was-validated .form-control.is-invalid,.bootstrap-dark .was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc3545;padding-right:calc(1.5em + .75rem)!important}.bootstrap-dark .was-validated .form-control.is-invalid:focus,.bootstrap-dark .was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap-dark .was-validated select.form-control.is-invalid,.bootstrap-dark .was-validated select.form-control:invalid{background-position:right 1.5rem center;padding-right:3rem!important}.bootstrap-dark .was-validated textarea.form-control.is-invalid,.bootstrap-dark .was-validated textarea.form-control:invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.bootstrap-dark .was-validated .custom-select.is-invalid,.bootstrap-dark .was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#000 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#dc3545;padding-right:calc(.75em + 2.3125rem)!important}.bootstrap-dark .was-validated .custom-select.is-invalid:focus,.bootstrap-dark .was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap-dark .was-validated .form-check-input.is-invalid~.form-check-label,.bootstrap-dark .was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.bootstrap-dark .was-validated .form-check-input.is-invalid~.invalid-feedback,.bootstrap-dark .was-validated .form-check-input.is-invalid~.invalid-tooltip,.bootstrap-dark .was-validated .form-check-input:invalid~.invalid-feedback,.bootstrap-dark .was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.bootstrap-dark .was-validated .custom-control-input.is-invalid~.custom-control-label,.bootstrap-dark .was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.bootstrap-dark .was-validated .custom-control-input.is-invalid~.custom-control-label:before,.bootstrap-dark .was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.bootstrap-dark .was-validated .custom-control-input.is-invalid:checked~.custom-control-label:before,.bootstrap-dark .was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e4606d;border-color:#e4606d}.bootstrap-dark .was-validated .custom-control-input.is-invalid:focus~.custom-control-label:before,.bootstrap-dark .was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #dc354540}.bootstrap-dark .was-validated .custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.bootstrap-dark .was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.bootstrap-dark .was-validated .custom-file-input.is-invalid~.custom-file-label,.bootstrap-dark .was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.bootstrap-dark .was-validated .custom-file-input.is-invalid:focus~.custom-file-label,.bootstrap-dark .was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem #dc354540}.bootstrap-dark .was-validated .is-invalid~.invalid-feedback,.bootstrap-dark .was-validated .is-invalid~.invalid-tooltip,.bootstrap-dark .was-validated :invalid~.invalid-feedback,.bootstrap-dark .was-validated :invalid~.invalid-tooltip{display:block}.bootstrap-dark .btn{background-color:initial;border:1px solid #0000;border-radius:.25rem;color:#d3d3d3;display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;user-select:none;vertical-align:middle}@media(prefers-reduced-motion:reduce){.bootstrap-dark .btn{transition:none}}.bootstrap-dark .btn:hover{color:#d3d3d3;text-decoration:none}.bootstrap-dark .btn.focus,.bootstrap-dark .btn:focus{box-shadow:0 0 0 .2rem #007bff40;outline:0}.bootstrap-dark .btn.disabled,.bootstrap-dark .btn:disabled{opacity:.65}.bootstrap-dark .btn:not(:disabled):not(.disabled){cursor:pointer}.bootstrap-dark a.btn.disabled,.bootstrap-dark fieldset:disabled a.btn{pointer-events:none}.bootstrap-dark .btn-primary{background-color:#007bff;border-color:#007bff;color:#ced4da}.bootstrap-dark .btn-primary:hover{background-color:#0069d9;border-color:#0062cc;color:#ced4da}.bootstrap-dark .btn-primary.focus,.bootstrap-dark .btn-primary:focus{background-color:#0069d9;border-color:#0062cc;box-shadow:0 0 0 .2rem #1f88f980;color:#ced4da}.bootstrap-dark .btn-primary.disabled,.bootstrap-dark .btn-primary:disabled{background-color:#007bff;border-color:#007bff;color:#ced4da}.bootstrap-dark .btn-primary:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-primary:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-primary.dropdown-toggle{background-color:#0062cc;border-color:#005cbf;color:#ced4da}.bootstrap-dark .btn-primary:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-primary:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #1f88f980}.bootstrap-dark .btn-secondary{background-color:#6c757d;border-color:#6c757d;color:#ced4da}.bootstrap-dark .btn-secondary:hover{background-color:#5a6268;border-color:#545b62;color:#ced4da}.bootstrap-dark .btn-secondary.focus,.bootstrap-dark .btn-secondary:focus{background-color:#5a6268;border-color:#545b62;box-shadow:0 0 0 .2rem #7b838b80;color:#ced4da}.bootstrap-dark .btn-secondary.disabled,.bootstrap-dark .btn-secondary:disabled{background-color:#6c757d;border-color:#6c757d;color:#ced4da}.bootstrap-dark .btn-secondary:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-secondary:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-secondary.dropdown-toggle{background-color:#545b62;border-color:#4e555b;color:#ced4da}.bootstrap-dark .btn-secondary:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #7b838b80}.bootstrap-dark .btn-success{background-color:#28a745;border-color:#28a745;color:#ced4da}.bootstrap-dark .btn-success:hover{background-color:#218838;border-color:#1e7e34;color:#ced4da}.bootstrap-dark .btn-success.focus,.bootstrap-dark .btn-success:focus{background-color:#218838;border-color:#1e7e34;box-shadow:0 0 0 .2rem #41ae5b80;color:#ced4da}.bootstrap-dark .btn-success.disabled,.bootstrap-dark .btn-success:disabled{background-color:#28a745;border-color:#28a745;color:#ced4da}.bootstrap-dark .btn-success:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-success:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-success.dropdown-toggle{background-color:#1e7e34;border-color:#1c7430;color:#ced4da}.bootstrap-dark .btn-success:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-success:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #41ae5b80}.bootstrap-dark .btn-info{background-color:#17a2b8;border-color:#17a2b8;color:#ced4da}.bootstrap-dark .btn-info:hover{background-color:#138496;border-color:#117a8b;color:#ced4da}.bootstrap-dark .btn-info.focus,.bootstrap-dark .btn-info:focus{background-color:#138496;border-color:#117a8b;box-shadow:0 0 0 .2rem #32aabd80;color:#ced4da}.bootstrap-dark .btn-info.disabled,.bootstrap-dark .btn-info:disabled{background-color:#17a2b8;border-color:#17a2b8;color:#ced4da}.bootstrap-dark .btn-info:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-info:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-info.dropdown-toggle{background-color:#117a8b;border-color:#10707f;color:#ced4da}.bootstrap-dark .btn-info:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-info:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #32aabd80}.bootstrap-dark .btn-warning{background-color:#ffc107;border-color:#ffc107;color:#212529}.bootstrap-dark .btn-warning:hover{background-color:#e0a800;border-color:#d39e00;color:#212529}.bootstrap-dark .btn-warning.focus,.bootstrap-dark .btn-warning:focus{background-color:#e0a800;border-color:#d39e00;box-shadow:0 0 0 .2rem #deaa0c80;color:#212529}.bootstrap-dark .btn-warning.disabled,.bootstrap-dark .btn-warning:disabled{background-color:#ffc107;border-color:#ffc107;color:#212529}.bootstrap-dark .btn-warning:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-warning:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-warning.dropdown-toggle{background-color:#d39e00;border-color:#c69500;color:#212529}.bootstrap-dark .btn-warning:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-warning:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #deaa0c80}.bootstrap-dark .btn-danger{background-color:#dc3545;border-color:#dc3545;color:#ced4da}.bootstrap-dark .btn-danger:hover{background-color:#c82333;border-color:#bd2130;color:#ced4da}.bootstrap-dark .btn-danger.focus,.bootstrap-dark .btn-danger:focus{background-color:#c82333;border-color:#bd2130;box-shadow:0 0 0 .2rem #da4d5b80;color:#ced4da}.bootstrap-dark .btn-danger.disabled,.bootstrap-dark .btn-danger:disabled{background-color:#dc3545;border-color:#dc3545;color:#ced4da}.bootstrap-dark .btn-danger:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-danger:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-danger.dropdown-toggle{background-color:#bd2130;border-color:#b21f2d;color:#ced4da}.bootstrap-dark .btn-danger:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-danger:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #da4d5b80}.bootstrap-dark .btn-light{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.bootstrap-dark .btn-light:hover{background-color:#e2e6ea;border-color:#dae0e5;color:#212529}.bootstrap-dark .btn-light.focus,.bootstrap-dark .btn-light:focus{background-color:#e2e6ea;border-color:#dae0e5;box-shadow:0 0 0 .2rem #d8d9db80;color:#212529}.bootstrap-dark .btn-light.disabled,.bootstrap-dark .btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.bootstrap-dark .btn-light:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-light:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-light.dropdown-toggle{background-color:#dae0e5;border-color:#d3d9df;color:#212529}.bootstrap-dark .btn-light:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-light:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #d8d9db80}.bootstrap-dark .btn-dark{background-color:#343a40;border-color:#343a40;color:#ced4da}.bootstrap-dark .btn-dark:hover{background-color:#23272b;border-color:#1d2124;color:#ced4da}.bootstrap-dark .btn-dark.focus,.bootstrap-dark .btn-dark:focus{background-color:#23272b;border-color:#1d2124;box-shadow:0 0 0 .2rem #4b515780;color:#ced4da}.bootstrap-dark .btn-dark.disabled,.bootstrap-dark .btn-dark:disabled{background-color:#343a40;border-color:#343a40;color:#ced4da}.bootstrap-dark .btn-dark:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-dark:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-dark.dropdown-toggle{background-color:#1d2124;border-color:#171a1d;color:#ced4da}.bootstrap-dark .btn-dark:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-dark:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #4b515780}.bootstrap-dark .btn-outline-primary{border-color:#007bff;color:#007bff}.bootstrap-dark .btn-outline-primary:hover{background-color:#007bff;border-color:#007bff;color:#ced4da}.bootstrap-dark .btn-outline-primary.focus,.bootstrap-dark .btn-outline-primary:focus{box-shadow:0 0 0 .2rem #007bff80}.bootstrap-dark .btn-outline-primary.disabled,.bootstrap-dark .btn-outline-primary:disabled{background-color:initial;color:#007bff}.bootstrap-dark .btn-outline-primary:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-outline-primary:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-outline-primary.dropdown-toggle{background-color:#007bff;border-color:#007bff;color:#ced4da}.bootstrap-dark .btn-outline-primary:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #007bff80}.bootstrap-dark .btn-outline-secondary{border-color:#6c757d;color:#6c757d}.bootstrap-dark .btn-outline-secondary:hover{background-color:#6c757d;border-color:#6c757d;color:#ced4da}.bootstrap-dark .btn-outline-secondary.focus,.bootstrap-dark .btn-outline-secondary:focus{box-shadow:0 0 0 .2rem #6c757d80}.bootstrap-dark .btn-outline-secondary.disabled,.bootstrap-dark .btn-outline-secondary:disabled{background-color:initial;color:#6c757d}.bootstrap-dark .btn-outline-secondary:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-outline-secondary.dropdown-toggle{background-color:#6c757d;border-color:#6c757d;color:#ced4da}.bootstrap-dark .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #6c757d80}.bootstrap-dark .btn-outline-success{border-color:#28a745;color:#28a745}.bootstrap-dark .btn-outline-success:hover{background-color:#28a745;border-color:#28a745;color:#ced4da}.bootstrap-dark .btn-outline-success.focus,.bootstrap-dark .btn-outline-success:focus{box-shadow:0 0 0 .2rem #28a74580}.bootstrap-dark .btn-outline-success.disabled,.bootstrap-dark .btn-outline-success:disabled{background-color:initial;color:#28a745}.bootstrap-dark .btn-outline-success:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-outline-success:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-outline-success.dropdown-toggle{background-color:#28a745;border-color:#28a745;color:#ced4da}.bootstrap-dark .btn-outline-success:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #28a74580}.bootstrap-dark .btn-outline-info{border-color:#17a2b8;color:#17a2b8}.bootstrap-dark .btn-outline-info:hover{background-color:#17a2b8;border-color:#17a2b8;color:#ced4da}.bootstrap-dark .btn-outline-info.focus,.bootstrap-dark .btn-outline-info:focus{box-shadow:0 0 0 .2rem #17a2b880}.bootstrap-dark .btn-outline-info.disabled,.bootstrap-dark .btn-outline-info:disabled{background-color:initial;color:#17a2b8}.bootstrap-dark .btn-outline-info:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-outline-info:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-outline-info.dropdown-toggle{background-color:#17a2b8;border-color:#17a2b8;color:#ced4da}.bootstrap-dark .btn-outline-info:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #17a2b880}.bootstrap-dark .btn-outline-warning{border-color:#ffc107;color:#ffc107}.bootstrap-dark .btn-outline-warning:hover{background-color:#ffc107;border-color:#ffc107;color:#212529}.bootstrap-dark .btn-outline-warning.focus,.bootstrap-dark .btn-outline-warning:focus{box-shadow:0 0 0 .2rem #ffc10780}.bootstrap-dark .btn-outline-warning.disabled,.bootstrap-dark .btn-outline-warning:disabled{background-color:initial;color:#ffc107}.bootstrap-dark .btn-outline-warning:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-outline-warning:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-outline-warning.dropdown-toggle{background-color:#ffc107;border-color:#ffc107;color:#212529}.bootstrap-dark .btn-outline-warning:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #ffc10780}.bootstrap-dark .btn-outline-danger{border-color:#dc3545;color:#dc3545}.bootstrap-dark .btn-outline-danger:hover{background-color:#dc3545;border-color:#dc3545;color:#ced4da}.bootstrap-dark .btn-outline-danger.focus,.bootstrap-dark .btn-outline-danger:focus{box-shadow:0 0 0 .2rem #dc354580}.bootstrap-dark .btn-outline-danger.disabled,.bootstrap-dark .btn-outline-danger:disabled{background-color:initial;color:#dc3545}.bootstrap-dark .btn-outline-danger:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-outline-danger:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-outline-danger.dropdown-toggle{background-color:#dc3545;border-color:#dc3545;color:#ced4da}.bootstrap-dark .btn-outline-danger:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #dc354580}.bootstrap-dark .btn-outline-light{border-color:#f8f9fa;color:#f8f9fa}.bootstrap-dark .btn-outline-light:hover{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.bootstrap-dark .btn-outline-light.focus,.bootstrap-dark .btn-outline-light:focus{box-shadow:0 0 0 .2rem #f8f9fa80}.bootstrap-dark .btn-outline-light.disabled,.bootstrap-dark .btn-outline-light:disabled{background-color:initial;color:#f8f9fa}.bootstrap-dark .btn-outline-light:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-outline-light:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-outline-light.dropdown-toggle{background-color:#f8f9fa;border-color:#f8f9fa;color:#212529}.bootstrap-dark .btn-outline-light:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #f8f9fa80}.bootstrap-dark .btn-outline-dark{border-color:#343a40;color:#343a40}.bootstrap-dark .btn-outline-dark:hover{background-color:#343a40;border-color:#343a40;color:#ced4da}.bootstrap-dark .btn-outline-dark.focus,.bootstrap-dark .btn-outline-dark:focus{box-shadow:0 0 0 .2rem #343a4080}.bootstrap-dark .btn-outline-dark.disabled,.bootstrap-dark .btn-outline-dark:disabled{background-color:initial;color:#343a40}.bootstrap-dark .btn-outline-dark:not(:disabled):not(.disabled).active,.bootstrap-dark .btn-outline-dark:not(:disabled):not(.disabled):active,.show>.bootstrap-dark .btn-outline-dark.dropdown-toggle{background-color:#343a40;border-color:#343a40;color:#ced4da}.bootstrap-dark .btn-outline-dark:not(:disabled):not(.disabled).active:focus,.bootstrap-dark .btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.bootstrap-dark .btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem #343a4080}.bootstrap-dark .btn-link{color:#adadad;font-weight:400;text-decoration:none}.bootstrap-dark .btn-link:hover{color:#878787;text-decoration:underline}.bootstrap-dark .btn-link.focus,.bootstrap-dark .btn-link:focus{text-decoration:underline}.bootstrap-dark .btn-link.disabled,.bootstrap-dark .btn-link:disabled{color:#6c757d;pointer-events:none}.bootstrap-dark .btn-group-lg>.btn,.bootstrap-dark .btn-lg{border-radius:.3rem;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.bootstrap-dark .btn-group-sm>.btn,.bootstrap-dark .btn-sm{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.bootstrap-dark .btn-block{display:block;width:100%}.bootstrap-dark .btn-block+.btn-block{margin-top:.5rem}.bootstrap-dark input[type=button].btn-block,.bootstrap-dark input[type=reset].btn-block,.bootstrap-dark input[type=submit].btn-block{width:100%}.bootstrap-dark .fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.bootstrap-dark .fade{transition:none}}.bootstrap-dark .fade:not(.show){opacity:0}.bootstrap-dark .collapse:not(.show){display:none}.bootstrap-dark .collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.bootstrap-dark .collapsing{transition:none}}.bootstrap-dark .dropdown,.bootstrap-dark .dropleft,.bootstrap-dark .dropright,.bootstrap-dark .dropup{position:relative}.bootstrap-dark .dropdown-toggle{white-space:nowrap}.bootstrap-dark .dropdown-toggle:after{border-bottom:0;border-left:.3em solid #0000;border-right:.3em solid #0000;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.bootstrap-dark .dropdown-toggle:empty:after{margin-left:0}.bootstrap-dark .dropdown-menu{background-clip:padding-box;background-color:#000;border:1px solid #ffffff26;border-radius:.25rem;color:#d3d3d3;display:none;float:left;font-size:1rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.bootstrap-dark .dropdown-menu-left{left:0;right:auto}.bootstrap-dark .dropdown-menu-right{left:auto;right:0}@media(min-width:576px){.bootstrap-dark .dropdown-menu-sm-left{left:0;right:auto}.bootstrap-dark .dropdown-menu-sm-right{left:auto;right:0}}@media(min-width:768px){.bootstrap-dark .dropdown-menu-md-left{left:0;right:auto}.bootstrap-dark .dropdown-menu-md-right{left:auto;right:0}}@media(min-width:992px){.bootstrap-dark .dropdown-menu-lg-left{left:0;right:auto}.bootstrap-dark .dropdown-menu-lg-right{left:auto;right:0}}@media(min-width:1200px){.bootstrap-dark .dropdown-menu-xl-left{left:0;right:auto}.bootstrap-dark .dropdown-menu-xl-right{left:auto;right:0}}.bootstrap-dark .dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.bootstrap-dark .dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid #0000;border-right:.3em solid #0000;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.bootstrap-dark .dropup .dropdown-toggle:empty:after{margin-left:0}.bootstrap-dark .dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.bootstrap-dark .dropright .dropdown-toggle:after{border-bottom:.3em solid #0000;border-left:.3em solid;border-right:0;border-top:.3em solid #0000;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.bootstrap-dark .dropright .dropdown-toggle:empty:after{margin-left:0}.bootstrap-dark .dropright .dropdown-toggle:after{vertical-align:0}.bootstrap-dark .dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.bootstrap-dark .dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.bootstrap-dark .dropleft .dropdown-toggle:before{border-bottom:.3em solid #0000;border-right:.3em solid;border-top:.3em solid #0000;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.bootstrap-dark .dropleft .dropdown-toggle:empty:after{margin-left:0}.bootstrap-dark .dropleft .dropdown-toggle:before{vertical-align:0}.bootstrap-dark .dropdown-menu[x-placement^=bottom],.bootstrap-dark .dropdown-menu[x-placement^=left],.bootstrap-dark .dropdown-menu[x-placement^=right],.bootstrap-dark .dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.bootstrap-dark .dropdown-divider{border-top:1px solid #343a40;height:0;margin:.5rem 0;overflow:hidden}.bootstrap-dark .dropdown-item{background-color:initial;border:0;clear:both;color:#f8f9fa;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.bootstrap-dark .dropdown-item:focus,.bootstrap-dark .dropdown-item:hover{background-color:#212529;color:#fff;text-decoration:none}.bootstrap-dark .dropdown-item.active,.bootstrap-dark .dropdown-item:active{background-color:#3395ff;color:#000;text-decoration:none}.bootstrap-dark .dropdown-item.disabled,.bootstrap-dark .dropdown-item:disabled{background-color:initial;color:#ced4da;pointer-events:none}.bootstrap-dark .dropdown-menu.show{display:block}.bootstrap-dark .dropdown-header{color:#ced4da;display:block;font-size:.875rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.bootstrap-dark .dropdown-item-text{color:#f8f9fa;display:block;padding:.25rem 1.5rem}.bootstrap-dark .btn-group,.bootstrap-dark .btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.bootstrap-dark .btn-group-vertical>.btn,.bootstrap-dark .btn-group>.btn{flex:1 1 auto;position:relative}.bootstrap-dark .btn-group-vertical>.btn.active,.bootstrap-dark .btn-group-vertical>.btn:active,.bootstrap-dark .btn-group-vertical>.btn:focus,.bootstrap-dark .btn-group-vertical>.btn:hover,.bootstrap-dark .btn-group>.btn.active,.bootstrap-dark .btn-group>.btn:active,.bootstrap-dark .btn-group>.btn:focus,.bootstrap-dark .btn-group>.btn:hover{z-index:1}.bootstrap-dark .btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.bootstrap-dark .btn-toolbar .input-group{width:auto}.bootstrap-dark .btn-group>.btn-group:not(:first-child),.bootstrap-dark .btn-group>.btn:not(:first-child){margin-left:-1px}.bootstrap-dark .btn-group>.btn-group:not(:last-child)>.btn,.bootstrap-dark .btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap-dark .btn-group>.btn-group:not(:first-child)>.btn,.bootstrap-dark .btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap-dark .dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.bootstrap-dark .dropdown-toggle-split:after,.dropright .bootstrap-dark .dropdown-toggle-split:after,.dropup .bootstrap-dark .dropdown-toggle-split:after{margin-left:0}.dropleft .bootstrap-dark .dropdown-toggle-split:before{margin-right:0}.bootstrap-dark .btn-group-sm>.btn+.dropdown-toggle-split,.bootstrap-dark .btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.bootstrap-dark .btn-group-lg>.btn+.dropdown-toggle-split,.bootstrap-dark .btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.bootstrap-dark .btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.bootstrap-dark .btn-group-vertical>.btn,.bootstrap-dark .btn-group-vertical>.btn-group{width:100%}.bootstrap-dark .btn-group-vertical>.btn-group:not(:first-child),.bootstrap-dark .btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.bootstrap-dark .btn-group-vertical>.btn-group:not(:last-child)>.btn,.bootstrap-dark .btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.bootstrap-dark .btn-group-vertical>.btn-group:not(:first-child)>.btn,.bootstrap-dark .btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.bootstrap-dark .btn-group-toggle>.btn,.bootstrap-dark .btn-group-toggle>.btn-group>.btn{margin-bottom:0}.bootstrap-dark .btn-group-toggle>.btn input[type=checkbox],.bootstrap-dark .btn-group-toggle>.btn input[type=radio],.bootstrap-dark .btn-group-toggle>.btn-group>.btn input[type=checkbox],.bootstrap-dark .btn-group-toggle>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.bootstrap-dark .input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.bootstrap-dark .input-group>.custom-file,.bootstrap-dark .input-group>.custom-select,.bootstrap-dark .input-group>.form-control,.bootstrap-dark .input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.bootstrap-dark .input-group>.custom-file+.custom-file,.bootstrap-dark .input-group>.custom-file+.custom-select,.bootstrap-dark .input-group>.custom-file+.form-control,.bootstrap-dark .input-group>.custom-select+.custom-file,.bootstrap-dark .input-group>.custom-select+.custom-select,.bootstrap-dark .input-group>.custom-select+.form-control,.bootstrap-dark .input-group>.form-control+.custom-file,.bootstrap-dark .input-group>.form-control+.custom-select,.bootstrap-dark .input-group>.form-control+.form-control,.bootstrap-dark .input-group>.form-control-plaintext+.custom-file,.bootstrap-dark .input-group>.form-control-plaintext+.custom-select,.bootstrap-dark .input-group>.form-control-plaintext+.form-control{margin-left:-1px}.bootstrap-dark .input-group>.custom-file .custom-file-input:focus~.custom-file-label,.bootstrap-dark .input-group>.custom-select:focus,.bootstrap-dark .input-group>.form-control:focus{z-index:3}.bootstrap-dark .input-group>.custom-file .custom-file-input:focus{z-index:4}.bootstrap-dark .input-group>.custom-select:not(:first-child),.bootstrap-dark .input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap-dark .input-group>.custom-file{align-items:center;display:flex}.bootstrap-dark .input-group>.custom-file:not(:last-child) .custom-file-label,.bootstrap-dark .input-group>.custom-file:not(:last-child) .custom-file-label:after{border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap-dark .input-group>.custom-file:not(:first-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap-dark .input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.bootstrap-dark .input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.bootstrap-dark .input-group.has-validation>.custom-select:nth-last-child(n+3),.bootstrap-dark .input-group.has-validation>.form-control:nth-last-child(n+3),.bootstrap-dark .input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.bootstrap-dark .input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.bootstrap-dark .input-group:not(.has-validation)>.custom-select:not(:last-child),.bootstrap-dark .input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap-dark .input-group-append,.bootstrap-dark .input-group-prepend{display:flex}.bootstrap-dark .input-group-append .btn,.bootstrap-dark .input-group-prepend .btn{position:relative;z-index:2}.bootstrap-dark .input-group-append .btn:focus,.bootstrap-dark .input-group-prepend .btn:focus{z-index:3}.bootstrap-dark .input-group-append .btn+.btn,.bootstrap-dark .input-group-append .btn+.input-group-text,.bootstrap-dark .input-group-append .input-group-text+.btn,.bootstrap-dark .input-group-append .input-group-text+.input-group-text,.bootstrap-dark .input-group-prepend .btn+.btn,.bootstrap-dark .input-group-prepend .btn+.input-group-text,.bootstrap-dark .input-group-prepend .input-group-text+.btn,.bootstrap-dark .input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.bootstrap-dark .input-group-prepend{margin-right:-1px}.bootstrap-dark .input-group-append{margin-left:-1px}.bootstrap-dark .input-group-text{align-items:center;background-color:#343a40;border:1px solid #6c757d;border-radius:.25rem;color:#dee2e6;display:flex;font-size:1rem;font-weight:400;line-height:1.5;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.bootstrap-dark .input-group-text input[type=checkbox],.bootstrap-dark .input-group-text input[type=radio]{margin-top:0}.bootstrap-dark .input-group-lg>.custom-select,.bootstrap-dark .input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.bootstrap-dark .input-group-lg>.custom-select,.bootstrap-dark .input-group-lg>.form-control,.bootstrap-dark .input-group-lg>.input-group-append>.btn,.bootstrap-dark .input-group-lg>.input-group-append>.input-group-text,.bootstrap-dark .input-group-lg>.input-group-prepend>.btn,.bootstrap-dark .input-group-lg>.input-group-prepend>.input-group-text{border-radius:.3rem;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.bootstrap-dark .input-group-sm>.custom-select,.bootstrap-dark .input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.bootstrap-dark .input-group-sm>.custom-select,.bootstrap-dark .input-group-sm>.form-control,.bootstrap-dark .input-group-sm>.input-group-append>.btn,.bootstrap-dark .input-group-sm>.input-group-append>.input-group-text,.bootstrap-dark .input-group-sm>.input-group-prepend>.btn,.bootstrap-dark .input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.bootstrap-dark .input-group-lg>.custom-select,.bootstrap-dark .input-group-sm>.custom-select{padding-right:1.75rem}.bootstrap-dark .input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.bootstrap-dark .input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.bootstrap-dark .input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.bootstrap-dark .input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.bootstrap-dark .input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.bootstrap-dark .input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.bootstrap-dark .input-group>.input-group-prepend>.btn,.bootstrap-dark .input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap-dark .input-group>.input-group-append>.btn,.bootstrap-dark .input-group>.input-group-append>.custom-select,.bootstrap-dark .input-group>.input-group-append>.input-group-text,.bootstrap-dark .input-group>.input-group-prepend:first-child>.btn:not(:first-child),.bootstrap-dark .input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.bootstrap-dark .input-group>.input-group-prepend:not(:first-child)>.btn,.bootstrap-dark .input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap-dark .input-group>.input-group-prepend>.custom-select{border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap-dark .custom-control{-webkit-print-color-adjust:exact;color-adjust:exact;display:block;min-height:1.5rem;padding-left:1.5rem;position:relative;z-index:1}.bootstrap-dark .custom-control-inline{display:inline-flex;margin-right:1rem}.bootstrap-dark .custom-control-input{height:1.25rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.bootstrap-dark .custom-control-input:checked~.custom-control-label:before{background-color:#007bff;border-color:#007bff;color:#fff}.bootstrap-dark .custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem #007bff40}.bootstrap-dark .custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#80bdff}.bootstrap-dark .custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#b3d7ff;border-color:#b3d7ff;color:#fff}.bootstrap-dark .custom-control-input:disabled~.custom-control-label,.bootstrap-dark .custom-control-input[disabled]~.custom-control-label{color:#6c757d}.bootstrap-dark .custom-control-input:disabled~.custom-control-label:before,.bootstrap-dark .custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.bootstrap-dark .custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.bootstrap-dark .custom-control-label:before{background-color:#fff;border:1px solid #adb5bd;pointer-events:none}.bootstrap-dark .custom-control-label:after,.bootstrap-dark .custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.25rem;width:1rem}.bootstrap-dark .custom-control-label:after{background:50%/50% 50% no-repeat}.bootstrap-dark .custom-checkbox .custom-control-label:before{border-radius:.25rem}.bootstrap-dark .custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.bootstrap-dark .custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#007bff;border-color:#007bff}.bootstrap-dark .custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.bootstrap-dark .custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before,.bootstrap-dark .custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:#007bff80}.bootstrap-dark .custom-radio .custom-control-label:before{border-radius:50%}.bootstrap-dark .custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.bootstrap-dark .custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:#007bff80}.bootstrap-dark .custom-switch{padding-left:2.25rem}.bootstrap-dark .custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.bootstrap-dark .custom-switch .custom-control-label:after{background-color:#adb5bd;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.25rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media(prefers-reduced-motion:reduce){.bootstrap-dark .custom-switch .custom-control-label:after{transition:none}}.bootstrap-dark .custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.bootstrap-dark .custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:#007bff80}.bootstrap-dark .custom-select{-webkit-appearance:none;appearance:none;background:#000 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #6c757d;border-radius:.25rem;color:#dee2e6;display:inline-block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.bootstrap-dark .custom-select:focus{border-color:#80bdff;box-shadow:0 0 0 .2rem #007bff40;outline:0}.bootstrap-dark .custom-select:focus::-ms-value{background-color:#000;color:#dee2e6}.bootstrap-dark .custom-select[multiple],.bootstrap-dark .custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.bootstrap-dark .custom-select:disabled{background-color:#343a40;color:#ced4da}.bootstrap-dark .custom-select::-ms-expand{display:none}.bootstrap-dark .custom-select:-moz-focusring{color:#0000;text-shadow:0 0 0 #dee2e6}.bootstrap-dark .custom-select-sm{font-size:.875rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.bootstrap-dark .custom-select-lg{font-size:1.25rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.bootstrap-dark .custom-file{display:inline-block;height:calc(1.5em + .75rem + 2px);margin-bottom:0;position:relative;width:100%}.bootstrap-dark .custom-file-input{height:calc(1.5em + .75rem + 2px);margin:0;opacity:0;overflow:hidden;position:relative;width:100%;z-index:2}.bootstrap-dark .custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem #007bff40}.bootstrap-dark .custom-file-input:disabled~.custom-file-label,.bootstrap-dark .custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.bootstrap-dark .custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.bootstrap-dark .custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.bootstrap-dark .custom-file-label{background-color:#fff;border:1px solid #ced4da;border-radius:.25rem;font-weight:400;height:calc(1.5em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.bootstrap-dark .custom-file-label,.bootstrap-dark .custom-file-label:after{color:#495057;line-height:1.5;padding:.375rem .75rem;position:absolute;right:0;top:0}.bootstrap-dark .custom-file-label:after{background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.5em + .75rem);z-index:3}.bootstrap-dark .custom-range{-webkit-appearance:none;appearance:none;background-color:initial;height:1.4rem;padding:0;width:100%}.bootstrap-dark .custom-range:focus{outline:0}.bootstrap-dark .custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #007bff40}.bootstrap-dark .custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #007bff40}.bootstrap-dark .custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem #007bff40}.bootstrap-dark .custom-range::-moz-focus-outer{border:0}.bootstrap-dark .custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#007bff;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.bootstrap-dark .custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.bootstrap-dark .custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.bootstrap-dark .custom-range::-webkit-slider-runnable-track{background-color:#dee2e6;border-color:#0000;border-radius:1rem;color:#0000;cursor:pointer;height:.5rem;width:100%}.bootstrap-dark .custom-range::-moz-range-thumb{appearance:none;background-color:#007bff;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.bootstrap-dark .custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.bootstrap-dark .custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.bootstrap-dark .custom-range::-moz-range-track{background-color:#dee2e6;border-color:#0000;border-radius:1rem;color:#0000;cursor:pointer;height:.5rem;width:100%}.bootstrap-dark .custom-range::-ms-thumb{appearance:none;background-color:#007bff;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media(prefers-reduced-motion:reduce){.bootstrap-dark .custom-range::-ms-thumb{-ms-transition:none;transition:none}}.bootstrap-dark .custom-range::-ms-thumb:active{background-color:#b3d7ff}.bootstrap-dark .custom-range::-ms-track{background-color:initial;border-color:#0000;border-width:.5rem;color:#0000;cursor:pointer;height:.5rem;width:100%}.bootstrap-dark .custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.bootstrap-dark .custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem;margin-right:15px}.bootstrap-dark .custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.bootstrap-dark .custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.bootstrap-dark .custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.bootstrap-dark .custom-range:disabled::-moz-range-track{cursor:default}.bootstrap-dark .custom-range:disabled::-ms-thumb{background-color:#adb5bd}.bootstrap-dark .custom-control-label:before,.bootstrap-dark .custom-file-label,.bootstrap-dark .custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.bootstrap-dark .custom-control-label:before,.bootstrap-dark .custom-file-label,.bootstrap-dark .custom-select{transition:none}}.bootstrap-dark .nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.bootstrap-dark .nav-link{display:block;padding:.5rem 1rem}.bootstrap-dark .nav-link:focus,.bootstrap-dark .nav-link:hover{text-decoration:none}.bootstrap-dark .nav-link.disabled{color:#6c757d;cursor:default;pointer-events:none}.bootstrap-dark .nav-tabs{border-bottom:1px solid hsla(0,0%,100%,.125)}.bootstrap-dark .nav-tabs .nav-link{border:1px solid #0000;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.bootstrap-dark .nav-tabs .nav-link:focus,.bootstrap-dark .nav-tabs .nav-link:hover{border-color:#495057 #495057 hsla(0,0%,100%,.125)}.bootstrap-dark .nav-tabs .nav-link.disabled{background-color:initial;border-color:#0000;color:#6c757d}.bootstrap-dark .nav-tabs .nav-item.show .nav-link,.bootstrap-dark .nav-tabs .nav-link.active{background-color:#191d21;border-color:#495057 #495057 #191d21;color:#f8f9fa}.bootstrap-dark .nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.bootstrap-dark .nav-pills .nav-link{border-radius:.25rem}.bootstrap-dark .nav-pills .nav-link.active,.bootstrap-dark .nav-pills .show>.nav-link{background-color:#007bff;color:#fff}.bootstrap-dark .nav-fill .nav-item,.bootstrap-dark .nav-fill>.nav-link{flex:1 1 auto;text-align:center}.bootstrap-dark .nav-justified .nav-item,.bootstrap-dark .nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.bootstrap-dark .tab-content>.tab-pane{display:none}.bootstrap-dark .tab-content>.active{display:block}.bootstrap-dark .navbar{padding:.5rem 1rem;position:relative}.bootstrap-dark .navbar,.bootstrap-dark .navbar .container,.bootstrap-dark .navbar .container-fluid,.bootstrap-dark .navbar .container-lg,.bootstrap-dark .navbar .container-md,.bootstrap-dark .navbar .container-sm,.bootstrap-dark .navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.bootstrap-dark .navbar-brand{display:inline-block;font-size:1.25rem;line-height:inherit;margin-right:1rem;padding-bottom:.3125rem;padding-top:.3125rem;white-space:nowrap}.bootstrap-dark .navbar-brand:focus,.bootstrap-dark .navbar-brand:hover{text-decoration:none}.bootstrap-dark .navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.bootstrap-dark .navbar-nav .nav-link{padding-left:0;padding-right:0}.bootstrap-dark .navbar-nav .dropdown-menu{float:none;position:static}.bootstrap-dark .navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.bootstrap-dark .navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.bootstrap-dark .navbar-toggler{background-color:initial;border:1px solid #0000;border-radius:.25rem;font-size:1.25rem;line-height:1;padding:.25rem .75rem}.bootstrap-dark .navbar-toggler:focus,.bootstrap-dark .navbar-toggler:hover{text-decoration:none}.bootstrap-dark .navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.bootstrap-dark .navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media(max-width:575.98px){.bootstrap-dark .navbar-expand-sm>.container,.bootstrap-dark .navbar-expand-sm>.container-fluid,.bootstrap-dark .navbar-expand-sm>.container-lg,.bootstrap-dark .navbar-expand-sm>.container-md,.bootstrap-dark .navbar-expand-sm>.container-sm,.bootstrap-dark .navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media(min-width:576px){.bootstrap-dark .navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.bootstrap-dark .navbar-expand-sm .navbar-nav{flex-direction:row}.bootstrap-dark .navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.bootstrap-dark .navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap-dark .navbar-expand-sm>.container,.bootstrap-dark .navbar-expand-sm>.container-fluid,.bootstrap-dark .navbar-expand-sm>.container-lg,.bootstrap-dark .navbar-expand-sm>.container-md,.bootstrap-dark .navbar-expand-sm>.container-sm,.bootstrap-dark .navbar-expand-sm>.container-xl{flex-wrap:nowrap}.bootstrap-dark .navbar-expand-sm .navbar-nav-scroll{overflow:visible}.bootstrap-dark .navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap-dark .navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.bootstrap-dark .navbar-expand-md>.container,.bootstrap-dark .navbar-expand-md>.container-fluid,.bootstrap-dark .navbar-expand-md>.container-lg,.bootstrap-dark .navbar-expand-md>.container-md,.bootstrap-dark .navbar-expand-md>.container-sm,.bootstrap-dark .navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media(min-width:768px){.bootstrap-dark .navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.bootstrap-dark .navbar-expand-md .navbar-nav{flex-direction:row}.bootstrap-dark .navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.bootstrap-dark .navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap-dark .navbar-expand-md>.container,.bootstrap-dark .navbar-expand-md>.container-fluid,.bootstrap-dark .navbar-expand-md>.container-lg,.bootstrap-dark .navbar-expand-md>.container-md,.bootstrap-dark .navbar-expand-md>.container-sm,.bootstrap-dark .navbar-expand-md>.container-xl{flex-wrap:nowrap}.bootstrap-dark .navbar-expand-md .navbar-nav-scroll{overflow:visible}.bootstrap-dark .navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap-dark .navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.bootstrap-dark .navbar-expand-lg>.container,.bootstrap-dark .navbar-expand-lg>.container-fluid,.bootstrap-dark .navbar-expand-lg>.container-lg,.bootstrap-dark .navbar-expand-lg>.container-md,.bootstrap-dark .navbar-expand-lg>.container-sm,.bootstrap-dark .navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media(min-width:992px){.bootstrap-dark .navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.bootstrap-dark .navbar-expand-lg .navbar-nav{flex-direction:row}.bootstrap-dark .navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.bootstrap-dark .navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap-dark .navbar-expand-lg>.container,.bootstrap-dark .navbar-expand-lg>.container-fluid,.bootstrap-dark .navbar-expand-lg>.container-lg,.bootstrap-dark .navbar-expand-lg>.container-md,.bootstrap-dark .navbar-expand-lg>.container-sm,.bootstrap-dark .navbar-expand-lg>.container-xl{flex-wrap:nowrap}.bootstrap-dark .navbar-expand-lg .navbar-nav-scroll{overflow:visible}.bootstrap-dark .navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap-dark .navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.bootstrap-dark .navbar-expand-xl>.container,.bootstrap-dark .navbar-expand-xl>.container-fluid,.bootstrap-dark .navbar-expand-xl>.container-lg,.bootstrap-dark .navbar-expand-xl>.container-md,.bootstrap-dark .navbar-expand-xl>.container-sm,.bootstrap-dark .navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media(min-width:1200px){.bootstrap-dark .navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.bootstrap-dark .navbar-expand-xl .navbar-nav{flex-direction:row}.bootstrap-dark .navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.bootstrap-dark .navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap-dark .navbar-expand-xl>.container,.bootstrap-dark .navbar-expand-xl>.container-fluid,.bootstrap-dark .navbar-expand-xl>.container-lg,.bootstrap-dark .navbar-expand-xl>.container-md,.bootstrap-dark .navbar-expand-xl>.container-sm,.bootstrap-dark .navbar-expand-xl>.container-xl{flex-wrap:nowrap}.bootstrap-dark .navbar-expand-xl .navbar-nav-scroll{overflow:visible}.bootstrap-dark .navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap-dark .navbar-expand-xl .navbar-toggler{display:none}}.bootstrap-dark .navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.bootstrap-dark .navbar-expand>.container,.bootstrap-dark .navbar-expand>.container-fluid,.bootstrap-dark .navbar-expand>.container-lg,.bootstrap-dark .navbar-expand>.container-md,.bootstrap-dark .navbar-expand>.container-sm,.bootstrap-dark .navbar-expand>.container-xl{padding-left:0;padding-right:0}.bootstrap-dark .navbar-expand .navbar-nav{flex-direction:row}.bootstrap-dark .navbar-expand .navbar-nav .dropdown-menu{position:absolute}.bootstrap-dark .navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.bootstrap-dark .navbar-expand>.container,.bootstrap-dark .navbar-expand>.container-fluid,.bootstrap-dark .navbar-expand>.container-lg,.bootstrap-dark .navbar-expand>.container-md,.bootstrap-dark .navbar-expand>.container-sm,.bootstrap-dark .navbar-expand>.container-xl{flex-wrap:nowrap}.bootstrap-dark .navbar-expand .navbar-nav-scroll{overflow:visible}.bootstrap-dark .navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.bootstrap-dark .navbar-expand .navbar-toggler{display:none}.bootstrap-dark .navbar-light .navbar-brand,.bootstrap-dark .navbar-light .navbar-brand:focus,.bootstrap-dark .navbar-light .navbar-brand:hover{color:#000000e6}.bootstrap-dark .navbar-light .navbar-nav .nav-link{color:#00000080}.bootstrap-dark .navbar-light .navbar-nav .nav-link:focus,.bootstrap-dark .navbar-light .navbar-nav .nav-link:hover{color:#000000b3}.bootstrap-dark .navbar-light .navbar-nav .nav-link.disabled{color:#0000004d}.bootstrap-dark .navbar-light .navbar-nav .active>.nav-link,.bootstrap-dark .navbar-light .navbar-nav .nav-link.active,.bootstrap-dark .navbar-light .navbar-nav .nav-link.show,.bootstrap-dark .navbar-light .navbar-nav .show>.nav-link{color:#000000e6}.bootstrap-dark .navbar-light .navbar-toggler{border-color:#0000001a;color:#00000080}.bootstrap-dark .navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.bootstrap-dark .navbar-light .navbar-text{color:#00000080}.bootstrap-dark .navbar-light .navbar-text a,.bootstrap-dark .navbar-light .navbar-text a:focus,.bootstrap-dark .navbar-light .navbar-text a:hover{color:#000000e6}.bootstrap-dark .navbar-dark .navbar-brand,.bootstrap-dark .navbar-dark .navbar-brand:focus,.bootstrap-dark .navbar-dark .navbar-brand:hover,.bootstrap-dark .navbar-themed .navbar-brand,.bootstrap-dark .navbar-themed .navbar-brand:focus,.bootstrap-dark .navbar-themed .navbar-brand:hover{color:#fff}.bootstrap-dark .navbar-dark .navbar-nav .nav-link,.bootstrap-dark .navbar-themed .navbar-nav .nav-link{color:#ffffff80}.bootstrap-dark .navbar-dark .navbar-nav .nav-link:focus,.bootstrap-dark .navbar-dark .navbar-nav .nav-link:hover,.bootstrap-dark .navbar-themed .navbar-nav .nav-link:focus,.bootstrap-dark .navbar-themed .navbar-nav .nav-link:hover{color:#ffffffbf}.bootstrap-dark .navbar-dark .navbar-nav .nav-link.disabled,.bootstrap-dark .navbar-themed .navbar-nav .nav-link.disabled{color:#ffffff40}.bootstrap-dark .navbar-dark .navbar-nav .active>.nav-link,.bootstrap-dark .navbar-dark .navbar-nav .nav-link.active,.bootstrap-dark .navbar-dark .navbar-nav .nav-link.show,.bootstrap-dark .navbar-dark .navbar-nav .show>.nav-link,.bootstrap-dark .navbar-themed .navbar-nav .active>.nav-link,.bootstrap-dark .navbar-themed .navbar-nav .nav-link.active,.bootstrap-dark .navbar-themed .navbar-nav .nav-link.show,.bootstrap-dark .navbar-themed .navbar-nav .show>.nav-link{color:#fff}.bootstrap-dark .navbar-dark .navbar-toggler,.bootstrap-dark .navbar-themed .navbar-toggler{border-color:#ffffff1a;color:#ffffff80}.bootstrap-dark .navbar-dark .navbar-toggler-icon,.bootstrap-dark .navbar-themed .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.bootstrap-dark .navbar-dark .navbar-text,.bootstrap-dark .navbar-themed .navbar-text{color:#ffffff80}.bootstrap-dark .navbar-dark .navbar-text a,.bootstrap-dark .navbar-dark .navbar-text a:focus,.bootstrap-dark .navbar-dark .navbar-text a:hover,.bootstrap-dark .navbar-themed .navbar-text a,.bootstrap-dark .navbar-themed .navbar-text a:focus,.bootstrap-dark .navbar-themed .navbar-text a:hover{color:#fff}.bootstrap-dark .card{word-wrap:break-word;background-clip:initial;background-color:#212529;border:1px solid hsla(0,0%,100%,.125);border-radius:.25rem;display:flex;flex-direction:column;min-width:0;position:relative}.bootstrap-dark .card>hr{margin-left:0;margin-right:0}.bootstrap-dark .card>.list-group{border-bottom:inherit;border-top:inherit}.bootstrap-dark .card>.list-group:first-child{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);border-top-width:0}.bootstrap-dark .card>.list-group:last-child{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px);border-bottom-width:0}.bootstrap-dark .card>.card-header+.list-group,.bootstrap-dark .card>.list-group+.card-footer{border-top:0}.bootstrap-dark .card-body{color:#e9ecef;flex:1 1 auto;min-height:1px;padding:1.25rem}.bootstrap-dark .card-title{margin-bottom:.75rem}.bootstrap-dark .card-subtitle{margin-bottom:0;margin-top:-.375rem}.bootstrap-dark .card-text:last-child{margin-bottom:0}.bootstrap-dark .card-link:hover{text-decoration:none}.bootstrap-dark .card-link+.card-link{margin-left:1.25rem}.bootstrap-dark .card-header{background-color:#ffffff08;border-bottom:1px solid hsla(0,0%,100%,.125);margin-bottom:0;padding:.75rem 1.25rem}.bootstrap-dark .card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.bootstrap-dark .card-footer{background-color:#ffffff08;border-top:1px solid hsla(0,0%,100%,.125);padding:.75rem 1.25rem}.bootstrap-dark .card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.bootstrap-dark .card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.bootstrap-dark .card-header-pills,.bootstrap-dark .card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.bootstrap-dark .card-img-overlay{border-radius:calc(.25rem - 1px);bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.bootstrap-dark .card-img,.bootstrap-dark .card-img-bottom,.bootstrap-dark .card-img-top{flex-shrink:0;width:100%}.bootstrap-dark .card-img,.bootstrap-dark .card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.bootstrap-dark .card-img,.bootstrap-dark .card-img-bottom{border-bottom-left-radius:calc(.25rem - 1px);border-bottom-right-radius:calc(.25rem - 1px)}.bootstrap-dark .card-deck .card{margin-bottom:15px}@media(min-width:576px){.bootstrap-dark .card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.bootstrap-dark .card-deck .card{flex:1 0;margin-bottom:0;margin-left:15px;margin-right:15px}}.bootstrap-dark .card-group>.card{margin-bottom:15px}@media(min-width:576px){.bootstrap-dark .card-group{display:flex;flex-flow:row wrap}.bootstrap-dark .card-group>.card{flex:1 0;margin-bottom:0}.bootstrap-dark .card-group>.card+.card{border-left:0;margin-left:0}.bootstrap-dark .card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.bootstrap-dark .card-group>.card:not(:last-child) .card-header,.bootstrap-dark .card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.bootstrap-dark .card-group>.card:not(:last-child) .card-footer,.bootstrap-dark .card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.bootstrap-dark .card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.bootstrap-dark .card-group>.card:not(:first-child) .card-header,.bootstrap-dark .card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.bootstrap-dark .card-group>.card:not(:first-child) .card-footer,.bootstrap-dark .card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.bootstrap-dark .card-columns .card{margin-bottom:.75rem}@media(min-width:576px){.bootstrap-dark .card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.bootstrap-dark .card-columns .card{display:inline-block;width:100%}}.bootstrap-dark .accordion{overflow-anchor:none}.bootstrap-dark .accordion>.card{overflow:hidden}.bootstrap-dark .accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.bootstrap-dark .accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.bootstrap-dark .accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.bootstrap-dark .breadcrumb{background-color:#343a40;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.bootstrap-dark .breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.bootstrap-dark .breadcrumb-item+.breadcrumb-item:before{color:#ced4da;content:"/";float:left;padding-right:.5rem}.bootstrap-dark .breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.bootstrap-dark .breadcrumb-item.active{color:#ced4da}.bootstrap-dark .pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.bootstrap-dark .page-link{background-color:#000;border:1px solid #495057;color:#adadad;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.bootstrap-dark .page-link:hover{background-color:#343a40;border-color:#495057;color:#878787;text-decoration:none;z-index:2}.bootstrap-dark .page-link:focus{box-shadow:0 0 0 .2rem #007bff40;outline:0;z-index:3}.bootstrap-dark .page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.bootstrap-dark .page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.bootstrap-dark .page-item.active .page-link{background-color:#3395ff;border-color:#3395ff;color:#000;z-index:3}.bootstrap-dark .page-item.disabled .page-link{background-color:#000;border-color:#495057;color:#ced4da;cursor:auto;pointer-events:none}.bootstrap-dark .pagination-lg .page-link{font-size:1.25rem;line-height:1.5;padding:.75rem 1.5rem}.bootstrap-dark .pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:.3rem;border-top-left-radius:.3rem}.bootstrap-dark .pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:.3rem;border-top-right-radius:.3rem}.bootstrap-dark .pagination-sm .page-link{font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.bootstrap-dark .pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.bootstrap-dark .pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.bootstrap-dark .badge{border-radius:.25rem;display:inline-block;font-size:75%;font-weight:700;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:initial;white-space:nowrap}@media(prefers-reduced-motion:reduce){.bootstrap-dark .badge{transition:none}}a.bootstrap-dark .badge:focus,a.bootstrap-dark .badge:hover{text-decoration:none}.bootstrap-dark .badge:empty{display:none}.bootstrap-dark .btn .badge{position:relative;top:-1px}.bootstrap-dark .badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.bootstrap-dark .badge-primary{background-color:#007bff;color:#ced4da}a.bootstrap-dark .badge-primary:focus,a.bootstrap-dark .badge-primary:hover{background-color:#0062cc;color:#ced4da}a.bootstrap-dark .badge-primary.focus,a.bootstrap-dark .badge-primary:focus{box-shadow:0 0 0 .2rem #007bff80;outline:0}.bootstrap-dark .badge-secondary{background-color:#6c757d;color:#ced4da}a.bootstrap-dark .badge-secondary:focus,a.bootstrap-dark .badge-secondary:hover{background-color:#545b62;color:#ced4da}a.bootstrap-dark .badge-secondary.focus,a.bootstrap-dark .badge-secondary:focus{box-shadow:0 0 0 .2rem #6c757d80;outline:0}.bootstrap-dark .badge-success{background-color:#28a745;color:#ced4da}a.bootstrap-dark .badge-success:focus,a.bootstrap-dark .badge-success:hover{background-color:#1e7e34;color:#ced4da}a.bootstrap-dark .badge-success.focus,a.bootstrap-dark .badge-success:focus{box-shadow:0 0 0 .2rem #28a74580;outline:0}.bootstrap-dark .badge-info{background-color:#17a2b8;color:#ced4da}a.bootstrap-dark .badge-info:focus,a.bootstrap-dark .badge-info:hover{background-color:#117a8b;color:#ced4da}a.bootstrap-dark .badge-info.focus,a.bootstrap-dark .badge-info:focus{box-shadow:0 0 0 .2rem #17a2b880;outline:0}.bootstrap-dark .badge-warning{background-color:#ffc107;color:#212529}a.bootstrap-dark .badge-warning:focus,a.bootstrap-dark .badge-warning:hover{background-color:#d39e00;color:#212529}a.bootstrap-dark .badge-warning.focus,a.bootstrap-dark .badge-warning:focus{box-shadow:0 0 0 .2rem #ffc10780;outline:0}.bootstrap-dark .badge-danger{background-color:#dc3545;color:#ced4da}a.bootstrap-dark .badge-danger:focus,a.bootstrap-dark .badge-danger:hover{background-color:#bd2130;color:#ced4da}a.bootstrap-dark .badge-danger.focus,a.bootstrap-dark .badge-danger:focus{box-shadow:0 0 0 .2rem #dc354580;outline:0}.bootstrap-dark .badge-light{background-color:#f8f9fa;color:#212529}a.bootstrap-dark .badge-light:focus,a.bootstrap-dark .badge-light:hover{background-color:#dae0e5;color:#212529}a.bootstrap-dark .badge-light.focus,a.bootstrap-dark .badge-light:focus{box-shadow:0 0 0 .2rem #f8f9fa80;outline:0}.bootstrap-dark .badge-dark{background-color:#343a40;color:#ced4da}a.bootstrap-dark .badge-dark:focus,a.bootstrap-dark .badge-dark:hover{background-color:#1d2124;color:#ced4da}a.bootstrap-dark .badge-dark.focus,a.bootstrap-dark .badge-dark:focus{box-shadow:0 0 0 .2rem #343a4080;outline:0}.bootstrap-dark .jumbotron{background-color:#343a40;border-radius:.3rem;margin-bottom:2rem;padding:2rem 1rem}@media(min-width:576px){.bootstrap-dark .jumbotron{padding:4rem 2rem}}.bootstrap-dark .jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.bootstrap-dark .alert{border:1px solid #0000;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.bootstrap-dark .alert-heading{color:inherit}.bootstrap-dark .alert-link{font-weight:700}.bootstrap-dark .alert-dismissible{padding-right:4rem}.bootstrap-dark .alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.bootstrap-dark .alert-primary{background-color:#cce5ff;border-color:#b8daff;color:#004085}.bootstrap-dark .alert-primary hr{border-top-color:#9fcdff}.bootstrap-dark .alert-primary .alert-link{color:#002752}.bootstrap-dark .alert-secondary{background-color:#e2e3e5;border-color:#d6d8db;color:#383d41}.bootstrap-dark .alert-secondary hr{border-top-color:#c8cbcf}.bootstrap-dark .alert-secondary .alert-link{color:#202326}.bootstrap-dark .alert-success{background-color:#d4edda;border-color:#c3e6cb;color:#155724}.bootstrap-dark .alert-success hr{border-top-color:#b1dfbb}.bootstrap-dark .alert-success .alert-link{color:#0b2e13}.bootstrap-dark .alert-info{background-color:#d1ecf1;border-color:#bee5eb;color:#0c5460}.bootstrap-dark .alert-info hr{border-top-color:#abdde5}.bootstrap-dark .alert-info .alert-link{color:#062c33}.bootstrap-dark .alert-warning{background-color:#fff3cd;border-color:#ffeeba;color:#856404}.bootstrap-dark .alert-warning hr{border-top-color:#ffe8a1}.bootstrap-dark .alert-warning .alert-link{color:#533f03}.bootstrap-dark .alert-danger{background-color:#f8d7da;border-color:#f5c6cb;color:#721c24}.bootstrap-dark .alert-danger hr{border-top-color:#f1b0b7}.bootstrap-dark .alert-danger .alert-link{color:#491217}.bootstrap-dark .alert-light{background-color:#fefefe;border-color:#fdfdfe;color:#818182}.bootstrap-dark .alert-light hr{border-top-color:#ececf6}.bootstrap-dark .alert-light .alert-link{color:#686868}.bootstrap-dark .alert-dark{background-color:#d6d8d9;border-color:#c6c8ca;color:#1b1e21}.bootstrap-dark .alert-dark hr{border-top-color:#b9bbbe}.bootstrap-dark .alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.bootstrap-dark .progress{background-color:#e9ecef;border-radius:.25rem;display:flex;font-size:.75rem;height:1rem;line-height:0;overflow:hidden}.bootstrap-dark .progress-bar{background-color:#007bff;color:#fff;display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-align:center;transition:width .6s ease;white-space:nowrap}@media(prefers-reduced-motion:reduce){.bootstrap-dark .progress-bar{transition:none}}.bootstrap-dark .progress-bar-striped{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 0,#0000 50%,#ffffff26 0,#ffffff26 75%,#0000 0,#0000);background-size:1rem 1rem}.bootstrap-dark .progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media(prefers-reduced-motion:reduce){.bootstrap-dark .progress-bar-animated{animation:none}}.bootstrap-dark .media{align-items:flex-start;display:flex}.bootstrap-dark .media-body{flex:1 1}.bootstrap-dark .list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.bootstrap-dark .list-group-item-action{color:#dee2e6;text-align:inherit;width:100%}.bootstrap-dark .list-group-item-action:focus,.bootstrap-dark .list-group-item-action:hover{background-color:#212529;color:#dee2e6;text-decoration:none;z-index:1}.bootstrap-dark .list-group-item-action:active{background-color:#343a40;color:#d3d3d3}.bootstrap-dark .list-group-item{background-color:#191d210d;border:1px solid hsla(0,0%,100%,.125);display:block;padding:.75rem 1.25rem;position:relative}.bootstrap-dark .list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.bootstrap-dark .list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bootstrap-dark .list-group-item.disabled,.bootstrap-dark .list-group-item:disabled{background-color:#191d210d;color:#ced4da;pointer-events:none}.bootstrap-dark .list-group-item.active{background-color:#3395ff;border-color:#3395ff;color:#000;z-index:2}.bootstrap-dark .list-group-item+.bootstrap-dark .list-group-item{border-top-width:0}.bootstrap-dark .list-group-item+.bootstrap-dark .list-group-item.active{border-top-width:1px;margin-top:-1px}.bootstrap-dark .list-group-horizontal{flex-direction:row}.bootstrap-dark .list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap-dark .list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap-dark .list-group-horizontal>.list-group-item.active{margin-top:0}.bootstrap-dark .list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap-dark .list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media(min-width:576px){.bootstrap-dark .list-group-horizontal-sm{flex-direction:row}.bootstrap-dark .list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap-dark .list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap-dark .list-group-horizontal-sm>.list-group-item.active{margin-top:0}.bootstrap-dark .list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap-dark .list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:768px){.bootstrap-dark .list-group-horizontal-md{flex-direction:row}.bootstrap-dark .list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap-dark .list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap-dark .list-group-horizontal-md>.list-group-item.active{margin-top:0}.bootstrap-dark .list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap-dark .list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:992px){.bootstrap-dark .list-group-horizontal-lg{flex-direction:row}.bootstrap-dark .list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap-dark .list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap-dark .list-group-horizontal-lg>.list-group-item.active{margin-top:0}.bootstrap-dark .list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap-dark .list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media(min-width:1200px){.bootstrap-dark .list-group-horizontal-xl{flex-direction:row}.bootstrap-dark .list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.bootstrap-dark .list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.bootstrap-dark .list-group-horizontal-xl>.list-group-item.active{margin-top:0}.bootstrap-dark .list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.bootstrap-dark .list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.bootstrap-dark .list-group-flush{border-radius:0}.bootstrap-dark .list-group-flush>.list-group-item{border-width:0 0 1px}.bootstrap-dark .list-group-flush>.list-group-item:last-child{border-bottom-width:0}.bootstrap-dark .list-group-item-primary{background-color:#b8daff;color:#004085}.bootstrap-dark .list-group-item-primary.list-group-item-action:focus,.bootstrap-dark .list-group-item-primary.list-group-item-action:hover{background-color:#9fcdff;color:#004085}.bootstrap-dark .list-group-item-primary.list-group-item-action.active{background-color:#004085;border-color:#004085;color:#fff}.bootstrap-dark .list-group-item-secondary{background-color:#d6d8db;color:#383d41}.bootstrap-dark .list-group-item-secondary.list-group-item-action:focus,.bootstrap-dark .list-group-item-secondary.list-group-item-action:hover{background-color:#c8cbcf;color:#383d41}.bootstrap-dark .list-group-item-secondary.list-group-item-action.active{background-color:#383d41;border-color:#383d41;color:#fff}.bootstrap-dark .list-group-item-success{background-color:#c3e6cb;color:#155724}.bootstrap-dark .list-group-item-success.list-group-item-action:focus,.bootstrap-dark .list-group-item-success.list-group-item-action:hover{background-color:#b1dfbb;color:#155724}.bootstrap-dark .list-group-item-success.list-group-item-action.active{background-color:#155724;border-color:#155724;color:#fff}.bootstrap-dark .list-group-item-info{background-color:#bee5eb;color:#0c5460}.bootstrap-dark .list-group-item-info.list-group-item-action:focus,.bootstrap-dark .list-group-item-info.list-group-item-action:hover{background-color:#abdde5;color:#0c5460}.bootstrap-dark .list-group-item-info.list-group-item-action.active{background-color:#0c5460;border-color:#0c5460;color:#fff}.bootstrap-dark .list-group-item-warning{background-color:#ffeeba;color:#856404}.bootstrap-dark .list-group-item-warning.list-group-item-action:focus,.bootstrap-dark .list-group-item-warning.list-group-item-action:hover{background-color:#ffe8a1;color:#856404}.bootstrap-dark .list-group-item-warning.list-group-item-action.active{background-color:#856404;border-color:#856404;color:#fff}.bootstrap-dark .list-group-item-danger{background-color:#f5c6cb;color:#721c24}.bootstrap-dark .list-group-item-danger.list-group-item-action:focus,.bootstrap-dark .list-group-item-danger.list-group-item-action:hover{background-color:#f1b0b7;color:#721c24}.bootstrap-dark .list-group-item-danger.list-group-item-action.active{background-color:#721c24;border-color:#721c24;color:#fff}.bootstrap-dark .list-group-item-light{background-color:#fdfdfe;color:#818182}.bootstrap-dark .list-group-item-light.list-group-item-action:focus,.bootstrap-dark .list-group-item-light.list-group-item-action:hover{background-color:#ececf6;color:#818182}.bootstrap-dark .list-group-item-light.list-group-item-action.active{background-color:#818182;border-color:#818182;color:#fff}.bootstrap-dark .list-group-item-dark{background-color:#c6c8ca;color:#1b1e21}.bootstrap-dark .list-group-item-dark.list-group-item-action:focus,.bootstrap-dark .list-group-item-dark.list-group-item-action:hover{background-color:#b9bbbe;color:#1b1e21}.bootstrap-dark .list-group-item-dark.list-group-item-action.active{background-color:#1b1e21;border-color:#1b1e21;color:#fff}.bootstrap-dark .close{color:#fff;float:right;font-size:1.5rem;font-weight:700;line-height:1;opacity:.5;text-shadow:0 1px 0 #000}.bootstrap-dark .close:hover{color:#fff;text-decoration:none}.bootstrap-dark .close:not(:disabled):not(.disabled):focus,.bootstrap-dark .close:not(:disabled):not(.disabled):hover{opacity:.75}.bootstrap-dark button.close{background-color:initial;border:0;padding:0}.bootstrap-dark a.close.disabled{pointer-events:none}.bootstrap-dark .toast{background-clip:padding-box;background-color:#000000d9;border:1px solid #ffffff1a;border-radius:.25rem;box-shadow:0 .25rem .75rem #ffffff1a;flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.bootstrap-dark .toast:not(:last-child){margin-bottom:.75rem}.bootstrap-dark .toast.showing{opacity:1}.bootstrap-dark .toast.show{display:block;opacity:1}.bootstrap-dark .toast.hide{display:none}.bootstrap-dark .toast-header{align-items:center;background-clip:padding-box;background-color:#000000d9;border-bottom:1px solid #ffffff0d;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#ced4da;display:flex;padding:.25rem .75rem}.bootstrap-dark .toast-body{padding:.75rem}.bootstrap-dark .modal-open{overflow:hidden}.bootstrap-dark .modal-open .modal{overflow-x:hidden;overflow-y:auto}.bootstrap-dark .modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.bootstrap-dark .modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .bootstrap-dark .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media(prefers-reduced-motion:reduce){.modal.fade .bootstrap-dark .modal-dialog{transition:none}}.modal.show .bootstrap-dark .modal-dialog{transform:none}.modal.modal-static .bootstrap-dark .modal-dialog{transform:scale(1.02)}.bootstrap-dark .modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.bootstrap-dark .modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.bootstrap-dark .modal-dialog-scrollable .modal-footer,.bootstrap-dark .modal-dialog-scrollable .modal-header{flex-shrink:0}.bootstrap-dark .modal-dialog-scrollable .modal-body{overflow-y:auto}.bootstrap-dark .modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.bootstrap-dark .modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:min-content}.bootstrap-dark .modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.bootstrap-dark .modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.bootstrap-dark .modal-dialog-centered.modal-dialog-scrollable:before{content:none}.bootstrap-dark .modal-content{background-clip:padding-box;background-color:#191d21;border:1px solid #fff3;border-radius:.3rem;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.bootstrap-dark .modal-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.bootstrap-dark .modal-backdrop.fade{opacity:0}.bootstrap-dark .modal-backdrop.show{opacity:.5}.bootstrap-dark .modal-header{align-items:flex-start;border-bottom:1px solid #343a40;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);display:flex;justify-content:space-between;padding:1rem}.bootstrap-dark .modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.bootstrap-dark .modal-title{line-height:1.5;margin-bottom:0}.bootstrap-dark .modal-body{flex:1 1 auto;padding:1rem;position:relative}.bootstrap-dark .modal-footer{align-items:center;border-bottom-left-radius:calc(.3rem - 1px);border-bottom-right-radius:calc(.3rem - 1px);border-top:1px solid #343a40;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.bootstrap-dark .modal-footer>*{margin:.25rem}.bootstrap-dark .modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media(min-width:576px){.bootstrap-dark .modal-dialog{margin:1.75rem auto;max-width:500px}.bootstrap-dark .modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.bootstrap-dark .modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.bootstrap-dark .modal-dialog-centered{min-height:calc(100% - 3.5rem)}.bootstrap-dark .modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-webkit-min-content;height:min-content}.bootstrap-dark .modal-sm{max-width:300px}}@media(min-width:992px){.bootstrap-dark .modal-lg,.bootstrap-dark .modal-xl{max-width:800px}}@media(min-width:1200px){.bootstrap-dark .modal-xl{max-width:1140px}}.bootstrap-dark .tooltip{word-wrap:break-word;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.875rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.bootstrap-dark .tooltip.show{opacity:.9}.bootstrap-dark .tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.bootstrap-dark .tooltip .arrow:before{border-color:#0000;border-style:solid;content:"";position:absolute}.bootstrap-dark .bs-tooltip-auto[x-placement^=top],.bootstrap-dark .bs-tooltip-top{padding:.4rem 0}.bootstrap-dark .bs-tooltip-auto[x-placement^=top] .arrow,.bootstrap-dark .bs-tooltip-top .arrow{bottom:0}.bootstrap-dark .bs-tooltip-auto[x-placement^=top] .arrow:before,.bootstrap-dark .bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bootstrap-dark .bs-tooltip-auto[x-placement^=right],.bootstrap-dark .bs-tooltip-right{padding:0 .4rem}.bootstrap-dark .bs-tooltip-auto[x-placement^=right] .arrow,.bootstrap-dark .bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bootstrap-dark .bs-tooltip-auto[x-placement^=right] .arrow:before,.bootstrap-dark .bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bootstrap-dark .bs-tooltip-auto[x-placement^=bottom],.bootstrap-dark .bs-tooltip-bottom{padding:.4rem 0}.bootstrap-dark .bs-tooltip-auto[x-placement^=bottom] .arrow,.bootstrap-dark .bs-tooltip-bottom .arrow{top:0}.bootstrap-dark .bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bootstrap-dark .bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bootstrap-dark .bs-tooltip-auto[x-placement^=left],.bootstrap-dark .bs-tooltip-left{padding:0 .4rem}.bootstrap-dark .bs-tooltip-auto[x-placement^=left] .arrow,.bootstrap-dark .bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bootstrap-dark .bs-tooltip-auto[x-placement^=left] .arrow:before,.bootstrap-dark .bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.bootstrap-dark .tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.bootstrap-dark .popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid #0003;border-radius:.3rem;display:block;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:.875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:276px;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.bootstrap-dark .popover .arrow{display:block;height:.5rem;margin:0 .3rem;position:absolute;width:1rem}.bootstrap-dark .popover .arrow:after,.bootstrap-dark .popover .arrow:before{border-color:#0000;border-style:solid;content:"";display:block;position:absolute}.bootstrap-dark .bs-popover-auto[x-placement^=top],.bootstrap-dark .bs-popover-top{margin-bottom:.5rem}.bootstrap-dark .bs-popover-auto[x-placement^=top]>.arrow,.bootstrap-dark .bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bootstrap-dark .bs-popover-auto[x-placement^=top]>.arrow:before,.bootstrap-dark .bs-popover-top>.arrow:before{border-top-color:#00000040;border-width:.5rem .5rem 0;bottom:0}.bootstrap-dark .bs-popover-auto[x-placement^=top]>.arrow:after,.bootstrap-dark .bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bootstrap-dark .bs-popover-auto[x-placement^=right],.bootstrap-dark .bs-popover-right{margin-left:.5rem}.bootstrap-dark .bs-popover-auto[x-placement^=right]>.arrow,.bootstrap-dark .bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:.3rem 0;width:.5rem}.bootstrap-dark .bs-popover-auto[x-placement^=right]>.arrow:before,.bootstrap-dark .bs-popover-right>.arrow:before{border-right-color:#00000040;border-width:.5rem .5rem .5rem 0;left:0}.bootstrap-dark .bs-popover-auto[x-placement^=right]>.arrow:after,.bootstrap-dark .bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bootstrap-dark .bs-popover-auto[x-placement^=bottom],.bootstrap-dark .bs-popover-bottom{margin-top:.5rem}.bootstrap-dark .bs-popover-auto[x-placement^=bottom]>.arrow,.bootstrap-dark .bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bootstrap-dark .bs-popover-auto[x-placement^=bottom]>.arrow:before,.bootstrap-dark .bs-popover-bottom>.arrow:before{border-bottom-color:#00000040;border-width:0 .5rem .5rem;top:0}.bootstrap-dark .bs-popover-auto[x-placement^=bottom]>.arrow:after,.bootstrap-dark .bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bootstrap-dark .bs-popover-auto[x-placement^=bottom] .popover-header:before,.bootstrap-dark .bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bootstrap-dark .bs-popover-auto[x-placement^=left],.bootstrap-dark .bs-popover-left{margin-right:.5rem}.bootstrap-dark .bs-popover-auto[x-placement^=left]>.arrow,.bootstrap-dark .bs-popover-left>.arrow{height:1rem;margin:.3rem 0;right:calc(-.5rem - 1px);width:.5rem}.bootstrap-dark .bs-popover-auto[x-placement^=left]>.arrow:before,.bootstrap-dark .bs-popover-left>.arrow:before{border-left-color:#00000040;border-width:.5rem 0 .5rem .5rem;right:0}.bootstrap-dark .bs-popover-auto[x-placement^=left]>.arrow:after,.bootstrap-dark .bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.bootstrap-dark .popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px);font-size:1rem;margin-bottom:0;padding:.5rem .75rem}.bootstrap-dark .popover-header:empty{display:none}.bootstrap-dark .popover-body{color:#212529;padding:.5rem .75rem}.bootstrap-dark .carousel{position:relative}.bootstrap-dark .carousel.pointer-event{touch-action:pan-y}.bootstrap-dark .carousel-inner{overflow:hidden;position:relative;width:100%}.bootstrap-dark .carousel-inner:after{clear:both;content:"";display:block}.bootstrap-dark .carousel-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media(prefers-reduced-motion:reduce){.bootstrap-dark .carousel-item{transition:none}}.bootstrap-dark .carousel-item-next,.bootstrap-dark .carousel-item-prev,.bootstrap-dark .carousel-item.active{display:block}.bootstrap-dark .active.carousel-item-right,.bootstrap-dark .carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.bootstrap-dark .active.carousel-item-left,.bootstrap-dark .carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.bootstrap-dark .carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.bootstrap-dark .carousel-fade .carousel-item-next.carousel-item-left,.bootstrap-dark .carousel-fade .carousel-item-prev.carousel-item-right,.bootstrap-dark .carousel-fade .carousel-item.active{opacity:1;z-index:1}.bootstrap-dark .carousel-fade .active.carousel-item-left,.bootstrap-dark .carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media(prefers-reduced-motion:reduce){.bootstrap-dark .carousel-fade .active.carousel-item-left,.bootstrap-dark .carousel-fade .active.carousel-item-right{transition:none}}.bootstrap-dark .carousel-control-next,.bootstrap-dark .carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media(prefers-reduced-motion:reduce){.bootstrap-dark .carousel-control-next,.bootstrap-dark .carousel-control-prev{transition:none}}.bootstrap-dark .carousel-control-next:focus,.bootstrap-dark .carousel-control-next:hover,.bootstrap-dark .carousel-control-prev:focus,.bootstrap-dark .carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.bootstrap-dark .carousel-control-prev{left:0}.bootstrap-dark .carousel-control-next{right:0}.bootstrap-dark .carousel-control-next-icon,.bootstrap-dark .carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.bootstrap-dark .carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.bootstrap-dark .carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.bootstrap-dark .carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.bootstrap-dark .carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid #0000;border-top:10px solid #0000;box-sizing:initial;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media(prefers-reduced-motion:reduce){.bootstrap-dark .carousel-indicators li{transition:none}}.bootstrap-dark .carousel-indicators .active{opacity:1}.bootstrap-dark .carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@keyframes spinner-border{to{transform:rotate(1turn)}}.bootstrap-dark .spinner-border{animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid #0000;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.bootstrap-dark .spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.bootstrap-dark .spinner-grow{animation:spinner-grow .75s linear infinite;background-color:currentColor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.bootstrap-dark .spinner-grow-sm{height:1rem;width:1rem}@media(prefers-reduced-motion:reduce){.bootstrap-dark .spinner-border,.bootstrap-dark .spinner-grow{animation-duration:1.5s}}.bootstrap-dark .align-baseline{vertical-align:initial!important}.bootstrap-dark .align-top{vertical-align:top!important}.bootstrap-dark .align-middle{vertical-align:middle!important}.bootstrap-dark .align-bottom{vertical-align:bottom!important}.bootstrap-dark .align-text-bottom{vertical-align:text-bottom!important}.bootstrap-dark .align-text-top{vertical-align:text-top!important}.bootstrap-dark .bg-primary{background-color:#007bff!important}.bootstrap-dark a.bg-primary:focus,.bootstrap-dark a.bg-primary:hover,.bootstrap-dark button.bg-primary:focus,.bootstrap-dark button.bg-primary:hover{background-color:#0062cc!important}.bootstrap-dark .bg-secondary{background-color:#6c757d!important}.bootstrap-dark a.bg-secondary:focus,.bootstrap-dark a.bg-secondary:hover,.bootstrap-dark button.bg-secondary:focus,.bootstrap-dark button.bg-secondary:hover{background-color:#545b62!important}.bootstrap-dark .bg-success{background-color:#28a745!important}.bootstrap-dark a.bg-success:focus,.bootstrap-dark a.bg-success:hover,.bootstrap-dark button.bg-success:focus,.bootstrap-dark button.bg-success:hover{background-color:#1e7e34!important}.bootstrap-dark .bg-info{background-color:#17a2b8!important}.bootstrap-dark a.bg-info:focus,.bootstrap-dark a.bg-info:hover,.bootstrap-dark button.bg-info:focus,.bootstrap-dark button.bg-info:hover{background-color:#117a8b!important}.bootstrap-dark .bg-warning{background-color:#ffc107!important}.bootstrap-dark a.bg-warning:focus,.bootstrap-dark a.bg-warning:hover,.bootstrap-dark button.bg-warning:focus,.bootstrap-dark button.bg-warning:hover{background-color:#d39e00!important}.bootstrap-dark .bg-danger{background-color:#dc3545!important}.bootstrap-dark a.bg-danger:focus,.bootstrap-dark a.bg-danger:hover,.bootstrap-dark button.bg-danger:focus,.bootstrap-dark button.bg-danger:hover{background-color:#bd2130!important}.bootstrap-dark .bg-light{background-color:#f8f9fa!important}.bootstrap-dark a.bg-light:focus,.bootstrap-dark a.bg-light:hover,.bootstrap-dark button.bg-light:focus,.bootstrap-dark button.bg-light:hover{background-color:#dae0e5!important}.bootstrap-dark .bg-dark,.bootstrap-dark .navbar-themed{background-color:#343a40!important}.bootstrap-dark a.bg-dark:focus,.bootstrap-dark a.bg-dark:hover,.bootstrap-dark a.navbar-themed:focus,.bootstrap-dark a.navbar-themed:hover,.bootstrap-dark button.bg-dark:focus,.bootstrap-dark button.bg-dark:hover,.bootstrap-dark button.navbar-themed:focus,.bootstrap-dark button.navbar-themed:hover{background-color:#1d2124!important}.bootstrap-dark .bg-white{background-color:#fff!important}.bootstrap-dark .bg-transparent{background-color:initial!important}.bootstrap-dark .border{border:1px solid #343a40!important}.bootstrap-dark .border-top{border-top:1px solid #343a40!important}.bootstrap-dark .border-right{border-right:1px solid #343a40!important}.bootstrap-dark .border-bottom{border-bottom:1px solid #343a40!important}.bootstrap-dark .border-left{border-left:1px solid #343a40!important}.bootstrap-dark .border-0{border:0!important}.bootstrap-dark .border-top-0{border-top:0!important}.bootstrap-dark .border-right-0{border-right:0!important}.bootstrap-dark .border-bottom-0{border-bottom:0!important}.bootstrap-dark .border-left-0{border-left:0!important}.bootstrap-dark .border-primary{border-color:#007bff!important}.bootstrap-dark .border-secondary{border-color:#6c757d!important}.bootstrap-dark .border-success{border-color:#28a745!important}.bootstrap-dark .border-info{border-color:#17a2b8!important}.bootstrap-dark .border-warning{border-color:#ffc107!important}.bootstrap-dark .border-danger{border-color:#dc3545!important}.bootstrap-dark .border-light{border-color:#f8f9fa!important}.bootstrap-dark .border-dark{border-color:#343a40!important}.bootstrap-dark .border-white{border-color:#fff!important}.bootstrap-dark .rounded-sm{border-radius:.2rem!important}.bootstrap-dark .rounded{border-radius:.25rem!important}.bootstrap-dark .rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.bootstrap-dark .rounded-right{border-bottom-right-radius:.25rem!important;border-top-right-radius:.25rem!important}.bootstrap-dark .rounded-bottom{border-bottom-left-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.bootstrap-dark .rounded-left{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.bootstrap-dark .rounded-lg{border-radius:.3rem!important}.bootstrap-dark .rounded-circle{border-radius:50%!important}.bootstrap-dark .rounded-pill{border-radius:50rem!important}.bootstrap-dark .rounded-0{border-radius:0!important}.bootstrap-dark .clearfix:after{clear:both;content:"";display:block}.bootstrap-dark .d-none{display:none!important}.bootstrap-dark .d-inline{display:inline!important}.bootstrap-dark .d-inline-block{display:inline-block!important}.bootstrap-dark .d-block{display:block!important}.bootstrap-dark .d-table{display:table!important}.bootstrap-dark .d-table-row{display:table-row!important}.bootstrap-dark .d-table-cell{display:table-cell!important}.bootstrap-dark .d-flex{display:flex!important}.bootstrap-dark .d-inline-flex{display:inline-flex!important}@media(min-width:576px){.bootstrap-dark .d-sm-none{display:none!important}.bootstrap-dark .d-sm-inline{display:inline!important}.bootstrap-dark .d-sm-inline-block{display:inline-block!important}.bootstrap-dark .d-sm-block{display:block!important}.bootstrap-dark .d-sm-table{display:table!important}.bootstrap-dark .d-sm-table-row{display:table-row!important}.bootstrap-dark .d-sm-table-cell{display:table-cell!important}.bootstrap-dark .d-sm-flex{display:flex!important}.bootstrap-dark .d-sm-inline-flex{display:inline-flex!important}}@media(min-width:768px){.bootstrap-dark .d-md-none{display:none!important}.bootstrap-dark .d-md-inline{display:inline!important}.bootstrap-dark .d-md-inline-block{display:inline-block!important}.bootstrap-dark .d-md-block{display:block!important}.bootstrap-dark .d-md-table{display:table!important}.bootstrap-dark .d-md-table-row{display:table-row!important}.bootstrap-dark .d-md-table-cell{display:table-cell!important}.bootstrap-dark .d-md-flex{display:flex!important}.bootstrap-dark .d-md-inline-flex{display:inline-flex!important}}@media(min-width:992px){.bootstrap-dark .d-lg-none{display:none!important}.bootstrap-dark .d-lg-inline{display:inline!important}.bootstrap-dark .d-lg-inline-block{display:inline-block!important}.bootstrap-dark .d-lg-block{display:block!important}.bootstrap-dark .d-lg-table{display:table!important}.bootstrap-dark .d-lg-table-row{display:table-row!important}.bootstrap-dark .d-lg-table-cell{display:table-cell!important}.bootstrap-dark .d-lg-flex{display:flex!important}.bootstrap-dark .d-lg-inline-flex{display:inline-flex!important}}@media(min-width:1200px){.bootstrap-dark .d-xl-none{display:none!important}.bootstrap-dark .d-xl-inline{display:inline!important}.bootstrap-dark .d-xl-inline-block{display:inline-block!important}.bootstrap-dark .d-xl-block{display:block!important}.bootstrap-dark .d-xl-table{display:table!important}.bootstrap-dark .d-xl-table-row{display:table-row!important}.bootstrap-dark .d-xl-table-cell{display:table-cell!important}.bootstrap-dark .d-xl-flex{display:flex!important}.bootstrap-dark .d-xl-inline-flex{display:inline-flex!important}}@media print{.bootstrap-dark .d-print-none{display:none!important}.bootstrap-dark .d-print-inline{display:inline!important}.bootstrap-dark .d-print-inline-block{display:inline-block!important}.bootstrap-dark .d-print-block{display:block!important}.bootstrap-dark .d-print-table{display:table!important}.bootstrap-dark .d-print-table-row{display:table-row!important}.bootstrap-dark .d-print-table-cell{display:table-cell!important}.bootstrap-dark .d-print-flex{display:flex!important}.bootstrap-dark .d-print-inline-flex{display:inline-flex!important}}.bootstrap-dark .embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.bootstrap-dark .embed-responsive:before{content:"";display:block}.bootstrap-dark .embed-responsive .embed-responsive-item,.bootstrap-dark .embed-responsive embed,.bootstrap-dark .embed-responsive iframe,.bootstrap-dark .embed-responsive object,.bootstrap-dark .embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.bootstrap-dark .embed-responsive-21by9:before{padding-top:42.85714286%}.bootstrap-dark .embed-responsive-16by9:before{padding-top:56.25%}.bootstrap-dark .embed-responsive-4by3:before{padding-top:75%}.bootstrap-dark .embed-responsive-1by1:before{padding-top:100%}.bootstrap-dark .flex-row{flex-direction:row!important}.bootstrap-dark .flex-column{flex-direction:column!important}.bootstrap-dark .flex-row-reverse{flex-direction:row-reverse!important}.bootstrap-dark .flex-column-reverse{flex-direction:column-reverse!important}.bootstrap-dark .flex-wrap{flex-wrap:wrap!important}.bootstrap-dark .flex-nowrap{flex-wrap:nowrap!important}.bootstrap-dark .flex-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap-dark .flex-fill{flex:1 1 auto!important}.bootstrap-dark .flex-grow-0{flex-grow:0!important}.bootstrap-dark .flex-grow-1{flex-grow:1!important}.bootstrap-dark .flex-shrink-0{flex-shrink:0!important}.bootstrap-dark .flex-shrink-1{flex-shrink:1!important}.bootstrap-dark .justify-content-start{justify-content:flex-start!important}.bootstrap-dark .justify-content-end{justify-content:flex-end!important}.bootstrap-dark .justify-content-center{justify-content:center!important}.bootstrap-dark .justify-content-between{justify-content:space-between!important}.bootstrap-dark .justify-content-around{justify-content:space-around!important}.bootstrap-dark .align-items-start{align-items:flex-start!important}.bootstrap-dark .align-items-end{align-items:flex-end!important}.bootstrap-dark .align-items-center{align-items:center!important}.bootstrap-dark .align-items-baseline{align-items:baseline!important}.bootstrap-dark .align-items-stretch{align-items:stretch!important}.bootstrap-dark .align-content-start{align-content:flex-start!important}.bootstrap-dark .align-content-end{align-content:flex-end!important}.bootstrap-dark .align-content-center{align-content:center!important}.bootstrap-dark .align-content-between{align-content:space-between!important}.bootstrap-dark .align-content-around{align-content:space-around!important}.bootstrap-dark .align-content-stretch{align-content:stretch!important}.bootstrap-dark .align-self-auto{align-self:auto!important}.bootstrap-dark .align-self-start{align-self:flex-start!important}.bootstrap-dark .align-self-end{align-self:flex-end!important}.bootstrap-dark .align-self-center{align-self:center!important}.bootstrap-dark .align-self-baseline{align-self:baseline!important}.bootstrap-dark .align-self-stretch{align-self:stretch!important}@media(min-width:576px){.bootstrap-dark .flex-sm-row{flex-direction:row!important}.bootstrap-dark .flex-sm-column{flex-direction:column!important}.bootstrap-dark .flex-sm-row-reverse{flex-direction:row-reverse!important}.bootstrap-dark .flex-sm-column-reverse{flex-direction:column-reverse!important}.bootstrap-dark .flex-sm-wrap{flex-wrap:wrap!important}.bootstrap-dark .flex-sm-nowrap{flex-wrap:nowrap!important}.bootstrap-dark .flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap-dark .flex-sm-fill{flex:1 1 auto!important}.bootstrap-dark .flex-sm-grow-0{flex-grow:0!important}.bootstrap-dark .flex-sm-grow-1{flex-grow:1!important}.bootstrap-dark .flex-sm-shrink-0{flex-shrink:0!important}.bootstrap-dark .flex-sm-shrink-1{flex-shrink:1!important}.bootstrap-dark .justify-content-sm-start{justify-content:flex-start!important}.bootstrap-dark .justify-content-sm-end{justify-content:flex-end!important}.bootstrap-dark .justify-content-sm-center{justify-content:center!important}.bootstrap-dark .justify-content-sm-between{justify-content:space-between!important}.bootstrap-dark .justify-content-sm-around{justify-content:space-around!important}.bootstrap-dark .align-items-sm-start{align-items:flex-start!important}.bootstrap-dark .align-items-sm-end{align-items:flex-end!important}.bootstrap-dark .align-items-sm-center{align-items:center!important}.bootstrap-dark .align-items-sm-baseline{align-items:baseline!important}.bootstrap-dark .align-items-sm-stretch{align-items:stretch!important}.bootstrap-dark .align-content-sm-start{align-content:flex-start!important}.bootstrap-dark .align-content-sm-end{align-content:flex-end!important}.bootstrap-dark .align-content-sm-center{align-content:center!important}.bootstrap-dark .align-content-sm-between{align-content:space-between!important}.bootstrap-dark .align-content-sm-around{align-content:space-around!important}.bootstrap-dark .align-content-sm-stretch{align-content:stretch!important}.bootstrap-dark .align-self-sm-auto{align-self:auto!important}.bootstrap-dark .align-self-sm-start{align-self:flex-start!important}.bootstrap-dark .align-self-sm-end{align-self:flex-end!important}.bootstrap-dark .align-self-sm-center{align-self:center!important}.bootstrap-dark .align-self-sm-baseline{align-self:baseline!important}.bootstrap-dark .align-self-sm-stretch{align-self:stretch!important}}@media(min-width:768px){.bootstrap-dark .flex-md-row{flex-direction:row!important}.bootstrap-dark .flex-md-column{flex-direction:column!important}.bootstrap-dark .flex-md-row-reverse{flex-direction:row-reverse!important}.bootstrap-dark .flex-md-column-reverse{flex-direction:column-reverse!important}.bootstrap-dark .flex-md-wrap{flex-wrap:wrap!important}.bootstrap-dark .flex-md-nowrap{flex-wrap:nowrap!important}.bootstrap-dark .flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap-dark .flex-md-fill{flex:1 1 auto!important}.bootstrap-dark .flex-md-grow-0{flex-grow:0!important}.bootstrap-dark .flex-md-grow-1{flex-grow:1!important}.bootstrap-dark .flex-md-shrink-0{flex-shrink:0!important}.bootstrap-dark .flex-md-shrink-1{flex-shrink:1!important}.bootstrap-dark .justify-content-md-start{justify-content:flex-start!important}.bootstrap-dark .justify-content-md-end{justify-content:flex-end!important}.bootstrap-dark .justify-content-md-center{justify-content:center!important}.bootstrap-dark .justify-content-md-between{justify-content:space-between!important}.bootstrap-dark .justify-content-md-around{justify-content:space-around!important}.bootstrap-dark .align-items-md-start{align-items:flex-start!important}.bootstrap-dark .align-items-md-end{align-items:flex-end!important}.bootstrap-dark .align-items-md-center{align-items:center!important}.bootstrap-dark .align-items-md-baseline{align-items:baseline!important}.bootstrap-dark .align-items-md-stretch{align-items:stretch!important}.bootstrap-dark .align-content-md-start{align-content:flex-start!important}.bootstrap-dark .align-content-md-end{align-content:flex-end!important}.bootstrap-dark .align-content-md-center{align-content:center!important}.bootstrap-dark .align-content-md-between{align-content:space-between!important}.bootstrap-dark .align-content-md-around{align-content:space-around!important}.bootstrap-dark .align-content-md-stretch{align-content:stretch!important}.bootstrap-dark .align-self-md-auto{align-self:auto!important}.bootstrap-dark .align-self-md-start{align-self:flex-start!important}.bootstrap-dark .align-self-md-end{align-self:flex-end!important}.bootstrap-dark .align-self-md-center{align-self:center!important}.bootstrap-dark .align-self-md-baseline{align-self:baseline!important}.bootstrap-dark .align-self-md-stretch{align-self:stretch!important}}@media(min-width:992px){.bootstrap-dark .flex-lg-row{flex-direction:row!important}.bootstrap-dark .flex-lg-column{flex-direction:column!important}.bootstrap-dark .flex-lg-row-reverse{flex-direction:row-reverse!important}.bootstrap-dark .flex-lg-column-reverse{flex-direction:column-reverse!important}.bootstrap-dark .flex-lg-wrap{flex-wrap:wrap!important}.bootstrap-dark .flex-lg-nowrap{flex-wrap:nowrap!important}.bootstrap-dark .flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap-dark .flex-lg-fill{flex:1 1 auto!important}.bootstrap-dark .flex-lg-grow-0{flex-grow:0!important}.bootstrap-dark .flex-lg-grow-1{flex-grow:1!important}.bootstrap-dark .flex-lg-shrink-0{flex-shrink:0!important}.bootstrap-dark .flex-lg-shrink-1{flex-shrink:1!important}.bootstrap-dark .justify-content-lg-start{justify-content:flex-start!important}.bootstrap-dark .justify-content-lg-end{justify-content:flex-end!important}.bootstrap-dark .justify-content-lg-center{justify-content:center!important}.bootstrap-dark .justify-content-lg-between{justify-content:space-between!important}.bootstrap-dark .justify-content-lg-around{justify-content:space-around!important}.bootstrap-dark .align-items-lg-start{align-items:flex-start!important}.bootstrap-dark .align-items-lg-end{align-items:flex-end!important}.bootstrap-dark .align-items-lg-center{align-items:center!important}.bootstrap-dark .align-items-lg-baseline{align-items:baseline!important}.bootstrap-dark .align-items-lg-stretch{align-items:stretch!important}.bootstrap-dark .align-content-lg-start{align-content:flex-start!important}.bootstrap-dark .align-content-lg-end{align-content:flex-end!important}.bootstrap-dark .align-content-lg-center{align-content:center!important}.bootstrap-dark .align-content-lg-between{align-content:space-between!important}.bootstrap-dark .align-content-lg-around{align-content:space-around!important}.bootstrap-dark .align-content-lg-stretch{align-content:stretch!important}.bootstrap-dark .align-self-lg-auto{align-self:auto!important}.bootstrap-dark .align-self-lg-start{align-self:flex-start!important}.bootstrap-dark .align-self-lg-end{align-self:flex-end!important}.bootstrap-dark .align-self-lg-center{align-self:center!important}.bootstrap-dark .align-self-lg-baseline{align-self:baseline!important}.bootstrap-dark .align-self-lg-stretch{align-self:stretch!important}}@media(min-width:1200px){.bootstrap-dark .flex-xl-row{flex-direction:row!important}.bootstrap-dark .flex-xl-column{flex-direction:column!important}.bootstrap-dark .flex-xl-row-reverse{flex-direction:row-reverse!important}.bootstrap-dark .flex-xl-column-reverse{flex-direction:column-reverse!important}.bootstrap-dark .flex-xl-wrap{flex-wrap:wrap!important}.bootstrap-dark .flex-xl-nowrap{flex-wrap:nowrap!important}.bootstrap-dark .flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.bootstrap-dark .flex-xl-fill{flex:1 1 auto!important}.bootstrap-dark .flex-xl-grow-0{flex-grow:0!important}.bootstrap-dark .flex-xl-grow-1{flex-grow:1!important}.bootstrap-dark .flex-xl-shrink-0{flex-shrink:0!important}.bootstrap-dark .flex-xl-shrink-1{flex-shrink:1!important}.bootstrap-dark .justify-content-xl-start{justify-content:flex-start!important}.bootstrap-dark .justify-content-xl-end{justify-content:flex-end!important}.bootstrap-dark .justify-content-xl-center{justify-content:center!important}.bootstrap-dark .justify-content-xl-between{justify-content:space-between!important}.bootstrap-dark .justify-content-xl-around{justify-content:space-around!important}.bootstrap-dark .align-items-xl-start{align-items:flex-start!important}.bootstrap-dark .align-items-xl-end{align-items:flex-end!important}.bootstrap-dark .align-items-xl-center{align-items:center!important}.bootstrap-dark .align-items-xl-baseline{align-items:baseline!important}.bootstrap-dark .align-items-xl-stretch{align-items:stretch!important}.bootstrap-dark .align-content-xl-start{align-content:flex-start!important}.bootstrap-dark .align-content-xl-end{align-content:flex-end!important}.bootstrap-dark .align-content-xl-center{align-content:center!important}.bootstrap-dark .align-content-xl-between{align-content:space-between!important}.bootstrap-dark .align-content-xl-around{align-content:space-around!important}.bootstrap-dark .align-content-xl-stretch{align-content:stretch!important}.bootstrap-dark .align-self-xl-auto{align-self:auto!important}.bootstrap-dark .align-self-xl-start{align-self:flex-start!important}.bootstrap-dark .align-self-xl-end{align-self:flex-end!important}.bootstrap-dark .align-self-xl-center{align-self:center!important}.bootstrap-dark .align-self-xl-baseline{align-self:baseline!important}.bootstrap-dark .align-self-xl-stretch{align-self:stretch!important}}.bootstrap-dark .float-left{float:left!important}.bootstrap-dark .float-right{float:right!important}.bootstrap-dark .float-none{float:none!important}@media(min-width:576px){.bootstrap-dark .float-sm-left{float:left!important}.bootstrap-dark .float-sm-right{float:right!important}.bootstrap-dark .float-sm-none{float:none!important}}@media(min-width:768px){.bootstrap-dark .float-md-left{float:left!important}.bootstrap-dark .float-md-right{float:right!important}.bootstrap-dark .float-md-none{float:none!important}}@media(min-width:992px){.bootstrap-dark .float-lg-left{float:left!important}.bootstrap-dark .float-lg-right{float:right!important}.bootstrap-dark .float-lg-none{float:none!important}}@media(min-width:1200px){.bootstrap-dark .float-xl-left{float:left!important}.bootstrap-dark .float-xl-right{float:right!important}.bootstrap-dark .float-xl-none{float:none!important}}.bootstrap-dark .user-select-all{-webkit-user-select:all!important;user-select:all!important}.bootstrap-dark .user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.bootstrap-dark .user-select-none{-webkit-user-select:none!important;user-select:none!important}.bootstrap-dark .overflow-auto{overflow:auto!important}.bootstrap-dark .overflow-hidden{overflow:hidden!important}.bootstrap-dark .position-static{position:static!important}.bootstrap-dark .position-relative{position:relative!important}.bootstrap-dark .position-absolute{position:absolute!important}.bootstrap-dark .position-fixed{position:fixed!important}.bootstrap-dark .position-sticky{position:-webkit-sticky!important;position:sticky!important}.bootstrap-dark .fixed-top{left:0;position:fixed;right:0;top:0;z-index:1030}.bootstrap-dark .fixed-bottom{bottom:0;left:0;position:fixed;right:0;z-index:1030}@supports((position:-webkit-sticky) or (position:sticky)){.bootstrap-dark .sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.bootstrap-dark .sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.bootstrap-dark .sr-only-focusable:active,.bootstrap-dark .sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.bootstrap-dark .shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.bootstrap-dark .shadow{box-shadow:0 .5rem 1rem #00000026!important}.bootstrap-dark .shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.bootstrap-dark .shadow-none{box-shadow:none!important}.bootstrap-dark .w-25{width:25%!important}.bootstrap-dark .w-50{width:50%!important}.bootstrap-dark .w-75{width:75%!important}.bootstrap-dark .w-100{width:100%!important}.bootstrap-dark .w-auto{width:auto!important}.bootstrap-dark .h-25{height:25%!important}.bootstrap-dark .h-50{height:50%!important}.bootstrap-dark .h-75{height:75%!important}.bootstrap-dark .h-100{height:100%!important}.bootstrap-dark .h-auto{height:auto!important}.bootstrap-dark .mw-100{max-width:100%!important}.bootstrap-dark .mh-100{max-height:100%!important}.bootstrap-dark .min-vw-100{min-width:100vw!important}.bootstrap-dark .min-vh-100{min-height:100vh!important}.bootstrap-dark .vw-100{width:100vw!important}.bootstrap-dark .vh-100{height:100vh!important}.bootstrap-dark .m-0{margin:0!important}.bootstrap-dark .mt-0,.bootstrap-dark .my-0{margin-top:0!important}.bootstrap-dark .mr-0,.bootstrap-dark .mx-0{margin-right:0!important}.bootstrap-dark .mb-0,.bootstrap-dark .my-0{margin-bottom:0!important}.bootstrap-dark .ml-0,.bootstrap-dark .mx-0{margin-left:0!important}.bootstrap-dark .m-1{margin:.25rem!important}.bootstrap-dark .mt-1,.bootstrap-dark .my-1{margin-top:.25rem!important}.bootstrap-dark .mr-1,.bootstrap-dark .mx-1{margin-right:.25rem!important}.bootstrap-dark .mb-1,.bootstrap-dark .my-1{margin-bottom:.25rem!important}.bootstrap-dark .ml-1,.bootstrap-dark .mx-1{margin-left:.25rem!important}.bootstrap-dark .m-2{margin:.5rem!important}.bootstrap-dark .mt-2,.bootstrap-dark .my-2{margin-top:.5rem!important}.bootstrap-dark .mr-2,.bootstrap-dark .mx-2{margin-right:.5rem!important}.bootstrap-dark .mb-2,.bootstrap-dark .my-2{margin-bottom:.5rem!important}.bootstrap-dark .ml-2,.bootstrap-dark .mx-2{margin-left:.5rem!important}.bootstrap-dark .m-3{margin:1rem!important}.bootstrap-dark .mt-3,.bootstrap-dark .my-3{margin-top:1rem!important}.bootstrap-dark .mr-3,.bootstrap-dark .mx-3{margin-right:1rem!important}.bootstrap-dark .mb-3,.bootstrap-dark .my-3{margin-bottom:1rem!important}.bootstrap-dark .ml-3,.bootstrap-dark .mx-3{margin-left:1rem!important}.bootstrap-dark .m-4{margin:1.5rem!important}.bootstrap-dark .mt-4,.bootstrap-dark .my-4{margin-top:1.5rem!important}.bootstrap-dark .mr-4,.bootstrap-dark .mx-4{margin-right:1.5rem!important}.bootstrap-dark .mb-4,.bootstrap-dark .my-4{margin-bottom:1.5rem!important}.bootstrap-dark .ml-4,.bootstrap-dark .mx-4{margin-left:1.5rem!important}.bootstrap-dark .m-5{margin:3rem!important}.bootstrap-dark .mt-5,.bootstrap-dark .my-5{margin-top:3rem!important}.bootstrap-dark .mr-5,.bootstrap-dark .mx-5{margin-right:3rem!important}.bootstrap-dark .mb-5,.bootstrap-dark .my-5{margin-bottom:3rem!important}.bootstrap-dark .ml-5,.bootstrap-dark .mx-5{margin-left:3rem!important}.bootstrap-dark .p-0{padding:0!important}.bootstrap-dark .pt-0,.bootstrap-dark .py-0{padding-top:0!important}.bootstrap-dark .pr-0,.bootstrap-dark .px-0{padding-right:0!important}.bootstrap-dark .pb-0,.bootstrap-dark .py-0{padding-bottom:0!important}.bootstrap-dark .pl-0,.bootstrap-dark .px-0{padding-left:0!important}.bootstrap-dark .p-1{padding:.25rem!important}.bootstrap-dark .pt-1,.bootstrap-dark .py-1{padding-top:.25rem!important}.bootstrap-dark .pr-1,.bootstrap-dark .px-1{padding-right:.25rem!important}.bootstrap-dark .pb-1,.bootstrap-dark .py-1{padding-bottom:.25rem!important}.bootstrap-dark .pl-1,.bootstrap-dark .px-1{padding-left:.25rem!important}.bootstrap-dark .p-2{padding:.5rem!important}.bootstrap-dark .pt-2,.bootstrap-dark .py-2{padding-top:.5rem!important}.bootstrap-dark .pr-2,.bootstrap-dark .px-2{padding-right:.5rem!important}.bootstrap-dark .pb-2,.bootstrap-dark .py-2{padding-bottom:.5rem!important}.bootstrap-dark .pl-2,.bootstrap-dark .px-2{padding-left:.5rem!important}.bootstrap-dark .p-3{padding:1rem!important}.bootstrap-dark .pt-3,.bootstrap-dark .py-3{padding-top:1rem!important}.bootstrap-dark .pr-3,.bootstrap-dark .px-3{padding-right:1rem!important}.bootstrap-dark .pb-3,.bootstrap-dark .py-3{padding-bottom:1rem!important}.bootstrap-dark .pl-3,.bootstrap-dark .px-3{padding-left:1rem!important}.bootstrap-dark .p-4{padding:1.5rem!important}.bootstrap-dark .pt-4,.bootstrap-dark .py-4{padding-top:1.5rem!important}.bootstrap-dark .pr-4,.bootstrap-dark .px-4{padding-right:1.5rem!important}.bootstrap-dark .pb-4,.bootstrap-dark .py-4{padding-bottom:1.5rem!important}.bootstrap-dark .pl-4,.bootstrap-dark .px-4{padding-left:1.5rem!important}.bootstrap-dark .p-5{padding:3rem!important}.bootstrap-dark .pt-5,.bootstrap-dark .py-5{padding-top:3rem!important}.bootstrap-dark .pr-5,.bootstrap-dark .px-5{padding-right:3rem!important}.bootstrap-dark .pb-5,.bootstrap-dark .py-5{padding-bottom:3rem!important}.bootstrap-dark .pl-5,.bootstrap-dark .px-5{padding-left:3rem!important}.bootstrap-dark .m-n1{margin:-.25rem!important}.bootstrap-dark .mt-n1,.bootstrap-dark .my-n1{margin-top:-.25rem!important}.bootstrap-dark .mr-n1,.bootstrap-dark .mx-n1{margin-right:-.25rem!important}.bootstrap-dark .mb-n1,.bootstrap-dark .my-n1{margin-bottom:-.25rem!important}.bootstrap-dark .ml-n1,.bootstrap-dark .mx-n1{margin-left:-.25rem!important}.bootstrap-dark .m-n2{margin:-.5rem!important}.bootstrap-dark .mt-n2,.bootstrap-dark .my-n2{margin-top:-.5rem!important}.bootstrap-dark .mr-n2,.bootstrap-dark .mx-n2{margin-right:-.5rem!important}.bootstrap-dark .mb-n2,.bootstrap-dark .my-n2{margin-bottom:-.5rem!important}.bootstrap-dark .ml-n2,.bootstrap-dark .mx-n2{margin-left:-.5rem!important}.bootstrap-dark .m-n3{margin:-1rem!important}.bootstrap-dark .mt-n3,.bootstrap-dark .my-n3{margin-top:-1rem!important}.bootstrap-dark .mr-n3,.bootstrap-dark .mx-n3{margin-right:-1rem!important}.bootstrap-dark .mb-n3,.bootstrap-dark .my-n3{margin-bottom:-1rem!important}.bootstrap-dark .ml-n3,.bootstrap-dark .mx-n3{margin-left:-1rem!important}.bootstrap-dark .m-n4{margin:-1.5rem!important}.bootstrap-dark .mt-n4,.bootstrap-dark .my-n4{margin-top:-1.5rem!important}.bootstrap-dark .mr-n4,.bootstrap-dark .mx-n4{margin-right:-1.5rem!important}.bootstrap-dark .mb-n4,.bootstrap-dark .my-n4{margin-bottom:-1.5rem!important}.bootstrap-dark .ml-n4,.bootstrap-dark .mx-n4{margin-left:-1.5rem!important}.bootstrap-dark .m-n5{margin:-3rem!important}.bootstrap-dark .mt-n5,.bootstrap-dark .my-n5{margin-top:-3rem!important}.bootstrap-dark .mr-n5,.bootstrap-dark .mx-n5{margin-right:-3rem!important}.bootstrap-dark .mb-n5,.bootstrap-dark .my-n5{margin-bottom:-3rem!important}.bootstrap-dark .ml-n5,.bootstrap-dark .mx-n5{margin-left:-3rem!important}.bootstrap-dark .m-auto{margin:auto!important}.bootstrap-dark .mt-auto,.bootstrap-dark .my-auto{margin-top:auto!important}.bootstrap-dark .mr-auto,.bootstrap-dark .mx-auto{margin-right:auto!important}.bootstrap-dark .mb-auto,.bootstrap-dark .my-auto{margin-bottom:auto!important}.bootstrap-dark .ml-auto,.bootstrap-dark .mx-auto{margin-left:auto!important}@media(min-width:576px){.bootstrap-dark .m-sm-0{margin:0!important}.bootstrap-dark .mt-sm-0,.bootstrap-dark .my-sm-0{margin-top:0!important}.bootstrap-dark .mr-sm-0,.bootstrap-dark .mx-sm-0{margin-right:0!important}.bootstrap-dark .mb-sm-0,.bootstrap-dark .my-sm-0{margin-bottom:0!important}.bootstrap-dark .ml-sm-0,.bootstrap-dark .mx-sm-0{margin-left:0!important}.bootstrap-dark .m-sm-1{margin:.25rem!important}.bootstrap-dark .mt-sm-1,.bootstrap-dark .my-sm-1{margin-top:.25rem!important}.bootstrap-dark .mr-sm-1,.bootstrap-dark .mx-sm-1{margin-right:.25rem!important}.bootstrap-dark .mb-sm-1,.bootstrap-dark .my-sm-1{margin-bottom:.25rem!important}.bootstrap-dark .ml-sm-1,.bootstrap-dark .mx-sm-1{margin-left:.25rem!important}.bootstrap-dark .m-sm-2{margin:.5rem!important}.bootstrap-dark .mt-sm-2,.bootstrap-dark .my-sm-2{margin-top:.5rem!important}.bootstrap-dark .mr-sm-2,.bootstrap-dark .mx-sm-2{margin-right:.5rem!important}.bootstrap-dark .mb-sm-2,.bootstrap-dark .my-sm-2{margin-bottom:.5rem!important}.bootstrap-dark .ml-sm-2,.bootstrap-dark .mx-sm-2{margin-left:.5rem!important}.bootstrap-dark .m-sm-3{margin:1rem!important}.bootstrap-dark .mt-sm-3,.bootstrap-dark .my-sm-3{margin-top:1rem!important}.bootstrap-dark .mr-sm-3,.bootstrap-dark .mx-sm-3{margin-right:1rem!important}.bootstrap-dark .mb-sm-3,.bootstrap-dark .my-sm-3{margin-bottom:1rem!important}.bootstrap-dark .ml-sm-3,.bootstrap-dark .mx-sm-3{margin-left:1rem!important}.bootstrap-dark .m-sm-4{margin:1.5rem!important}.bootstrap-dark .mt-sm-4,.bootstrap-dark .my-sm-4{margin-top:1.5rem!important}.bootstrap-dark .mr-sm-4,.bootstrap-dark .mx-sm-4{margin-right:1.5rem!important}.bootstrap-dark .mb-sm-4,.bootstrap-dark .my-sm-4{margin-bottom:1.5rem!important}.bootstrap-dark .ml-sm-4,.bootstrap-dark .mx-sm-4{margin-left:1.5rem!important}.bootstrap-dark .m-sm-5{margin:3rem!important}.bootstrap-dark .mt-sm-5,.bootstrap-dark .my-sm-5{margin-top:3rem!important}.bootstrap-dark .mr-sm-5,.bootstrap-dark .mx-sm-5{margin-right:3rem!important}.bootstrap-dark .mb-sm-5,.bootstrap-dark .my-sm-5{margin-bottom:3rem!important}.bootstrap-dark .ml-sm-5,.bootstrap-dark .mx-sm-5{margin-left:3rem!important}.bootstrap-dark .p-sm-0{padding:0!important}.bootstrap-dark .pt-sm-0,.bootstrap-dark .py-sm-0{padding-top:0!important}.bootstrap-dark .pr-sm-0,.bootstrap-dark .px-sm-0{padding-right:0!important}.bootstrap-dark .pb-sm-0,.bootstrap-dark .py-sm-0{padding-bottom:0!important}.bootstrap-dark .pl-sm-0,.bootstrap-dark .px-sm-0{padding-left:0!important}.bootstrap-dark .p-sm-1{padding:.25rem!important}.bootstrap-dark .pt-sm-1,.bootstrap-dark .py-sm-1{padding-top:.25rem!important}.bootstrap-dark .pr-sm-1,.bootstrap-dark .px-sm-1{padding-right:.25rem!important}.bootstrap-dark .pb-sm-1,.bootstrap-dark .py-sm-1{padding-bottom:.25rem!important}.bootstrap-dark .pl-sm-1,.bootstrap-dark .px-sm-1{padding-left:.25rem!important}.bootstrap-dark .p-sm-2{padding:.5rem!important}.bootstrap-dark .pt-sm-2,.bootstrap-dark .py-sm-2{padding-top:.5rem!important}.bootstrap-dark .pr-sm-2,.bootstrap-dark .px-sm-2{padding-right:.5rem!important}.bootstrap-dark .pb-sm-2,.bootstrap-dark .py-sm-2{padding-bottom:.5rem!important}.bootstrap-dark .pl-sm-2,.bootstrap-dark .px-sm-2{padding-left:.5rem!important}.bootstrap-dark .p-sm-3{padding:1rem!important}.bootstrap-dark .pt-sm-3,.bootstrap-dark .py-sm-3{padding-top:1rem!important}.bootstrap-dark .pr-sm-3,.bootstrap-dark .px-sm-3{padding-right:1rem!important}.bootstrap-dark .pb-sm-3,.bootstrap-dark .py-sm-3{padding-bottom:1rem!important}.bootstrap-dark .pl-sm-3,.bootstrap-dark .px-sm-3{padding-left:1rem!important}.bootstrap-dark .p-sm-4{padding:1.5rem!important}.bootstrap-dark .pt-sm-4,.bootstrap-dark .py-sm-4{padding-top:1.5rem!important}.bootstrap-dark .pr-sm-4,.bootstrap-dark .px-sm-4{padding-right:1.5rem!important}.bootstrap-dark .pb-sm-4,.bootstrap-dark .py-sm-4{padding-bottom:1.5rem!important}.bootstrap-dark .pl-sm-4,.bootstrap-dark .px-sm-4{padding-left:1.5rem!important}.bootstrap-dark .p-sm-5{padding:3rem!important}.bootstrap-dark .pt-sm-5,.bootstrap-dark .py-sm-5{padding-top:3rem!important}.bootstrap-dark .pr-sm-5,.bootstrap-dark .px-sm-5{padding-right:3rem!important}.bootstrap-dark .pb-sm-5,.bootstrap-dark .py-sm-5{padding-bottom:3rem!important}.bootstrap-dark .pl-sm-5,.bootstrap-dark .px-sm-5{padding-left:3rem!important}.bootstrap-dark .m-sm-n1{margin:-.25rem!important}.bootstrap-dark .mt-sm-n1,.bootstrap-dark .my-sm-n1{margin-top:-.25rem!important}.bootstrap-dark .mr-sm-n1,.bootstrap-dark .mx-sm-n1{margin-right:-.25rem!important}.bootstrap-dark .mb-sm-n1,.bootstrap-dark .my-sm-n1{margin-bottom:-.25rem!important}.bootstrap-dark .ml-sm-n1,.bootstrap-dark .mx-sm-n1{margin-left:-.25rem!important}.bootstrap-dark .m-sm-n2{margin:-.5rem!important}.bootstrap-dark .mt-sm-n2,.bootstrap-dark .my-sm-n2{margin-top:-.5rem!important}.bootstrap-dark .mr-sm-n2,.bootstrap-dark .mx-sm-n2{margin-right:-.5rem!important}.bootstrap-dark .mb-sm-n2,.bootstrap-dark .my-sm-n2{margin-bottom:-.5rem!important}.bootstrap-dark .ml-sm-n2,.bootstrap-dark .mx-sm-n2{margin-left:-.5rem!important}.bootstrap-dark .m-sm-n3{margin:-1rem!important}.bootstrap-dark .mt-sm-n3,.bootstrap-dark .my-sm-n3{margin-top:-1rem!important}.bootstrap-dark .mr-sm-n3,.bootstrap-dark .mx-sm-n3{margin-right:-1rem!important}.bootstrap-dark .mb-sm-n3,.bootstrap-dark .my-sm-n3{margin-bottom:-1rem!important}.bootstrap-dark .ml-sm-n3,.bootstrap-dark .mx-sm-n3{margin-left:-1rem!important}.bootstrap-dark .m-sm-n4{margin:-1.5rem!important}.bootstrap-dark .mt-sm-n4,.bootstrap-dark .my-sm-n4{margin-top:-1.5rem!important}.bootstrap-dark .mr-sm-n4,.bootstrap-dark .mx-sm-n4{margin-right:-1.5rem!important}.bootstrap-dark .mb-sm-n4,.bootstrap-dark .my-sm-n4{margin-bottom:-1.5rem!important}.bootstrap-dark .ml-sm-n4,.bootstrap-dark .mx-sm-n4{margin-left:-1.5rem!important}.bootstrap-dark .m-sm-n5{margin:-3rem!important}.bootstrap-dark .mt-sm-n5,.bootstrap-dark .my-sm-n5{margin-top:-3rem!important}.bootstrap-dark .mr-sm-n5,.bootstrap-dark .mx-sm-n5{margin-right:-3rem!important}.bootstrap-dark .mb-sm-n5,.bootstrap-dark .my-sm-n5{margin-bottom:-3rem!important}.bootstrap-dark .ml-sm-n5,.bootstrap-dark .mx-sm-n5{margin-left:-3rem!important}.bootstrap-dark .m-sm-auto{margin:auto!important}.bootstrap-dark .mt-sm-auto,.bootstrap-dark .my-sm-auto{margin-top:auto!important}.bootstrap-dark .mr-sm-auto,.bootstrap-dark .mx-sm-auto{margin-right:auto!important}.bootstrap-dark .mb-sm-auto,.bootstrap-dark .my-sm-auto{margin-bottom:auto!important}.bootstrap-dark .ml-sm-auto,.bootstrap-dark .mx-sm-auto{margin-left:auto!important}}@media(min-width:768px){.bootstrap-dark .m-md-0{margin:0!important}.bootstrap-dark .mt-md-0,.bootstrap-dark .my-md-0{margin-top:0!important}.bootstrap-dark .mr-md-0,.bootstrap-dark .mx-md-0{margin-right:0!important}.bootstrap-dark .mb-md-0,.bootstrap-dark .my-md-0{margin-bottom:0!important}.bootstrap-dark .ml-md-0,.bootstrap-dark .mx-md-0{margin-left:0!important}.bootstrap-dark .m-md-1{margin:.25rem!important}.bootstrap-dark .mt-md-1,.bootstrap-dark .my-md-1{margin-top:.25rem!important}.bootstrap-dark .mr-md-1,.bootstrap-dark .mx-md-1{margin-right:.25rem!important}.bootstrap-dark .mb-md-1,.bootstrap-dark .my-md-1{margin-bottom:.25rem!important}.bootstrap-dark .ml-md-1,.bootstrap-dark .mx-md-1{margin-left:.25rem!important}.bootstrap-dark .m-md-2{margin:.5rem!important}.bootstrap-dark .mt-md-2,.bootstrap-dark .my-md-2{margin-top:.5rem!important}.bootstrap-dark .mr-md-2,.bootstrap-dark .mx-md-2{margin-right:.5rem!important}.bootstrap-dark .mb-md-2,.bootstrap-dark .my-md-2{margin-bottom:.5rem!important}.bootstrap-dark .ml-md-2,.bootstrap-dark .mx-md-2{margin-left:.5rem!important}.bootstrap-dark .m-md-3{margin:1rem!important}.bootstrap-dark .mt-md-3,.bootstrap-dark .my-md-3{margin-top:1rem!important}.bootstrap-dark .mr-md-3,.bootstrap-dark .mx-md-3{margin-right:1rem!important}.bootstrap-dark .mb-md-3,.bootstrap-dark .my-md-3{margin-bottom:1rem!important}.bootstrap-dark .ml-md-3,.bootstrap-dark .mx-md-3{margin-left:1rem!important}.bootstrap-dark .m-md-4{margin:1.5rem!important}.bootstrap-dark .mt-md-4,.bootstrap-dark .my-md-4{margin-top:1.5rem!important}.bootstrap-dark .mr-md-4,.bootstrap-dark .mx-md-4{margin-right:1.5rem!important}.bootstrap-dark .mb-md-4,.bootstrap-dark .my-md-4{margin-bottom:1.5rem!important}.bootstrap-dark .ml-md-4,.bootstrap-dark .mx-md-4{margin-left:1.5rem!important}.bootstrap-dark .m-md-5{margin:3rem!important}.bootstrap-dark .mt-md-5,.bootstrap-dark .my-md-5{margin-top:3rem!important}.bootstrap-dark .mr-md-5,.bootstrap-dark .mx-md-5{margin-right:3rem!important}.bootstrap-dark .mb-md-5,.bootstrap-dark .my-md-5{margin-bottom:3rem!important}.bootstrap-dark .ml-md-5,.bootstrap-dark .mx-md-5{margin-left:3rem!important}.bootstrap-dark .p-md-0{padding:0!important}.bootstrap-dark .pt-md-0,.bootstrap-dark .py-md-0{padding-top:0!important}.bootstrap-dark .pr-md-0,.bootstrap-dark .px-md-0{padding-right:0!important}.bootstrap-dark .pb-md-0,.bootstrap-dark .py-md-0{padding-bottom:0!important}.bootstrap-dark .pl-md-0,.bootstrap-dark .px-md-0{padding-left:0!important}.bootstrap-dark .p-md-1{padding:.25rem!important}.bootstrap-dark .pt-md-1,.bootstrap-dark .py-md-1{padding-top:.25rem!important}.bootstrap-dark .pr-md-1,.bootstrap-dark .px-md-1{padding-right:.25rem!important}.bootstrap-dark .pb-md-1,.bootstrap-dark .py-md-1{padding-bottom:.25rem!important}.bootstrap-dark .pl-md-1,.bootstrap-dark .px-md-1{padding-left:.25rem!important}.bootstrap-dark .p-md-2{padding:.5rem!important}.bootstrap-dark .pt-md-2,.bootstrap-dark .py-md-2{padding-top:.5rem!important}.bootstrap-dark .pr-md-2,.bootstrap-dark .px-md-2{padding-right:.5rem!important}.bootstrap-dark .pb-md-2,.bootstrap-dark .py-md-2{padding-bottom:.5rem!important}.bootstrap-dark .pl-md-2,.bootstrap-dark .px-md-2{padding-left:.5rem!important}.bootstrap-dark .p-md-3{padding:1rem!important}.bootstrap-dark .pt-md-3,.bootstrap-dark .py-md-3{padding-top:1rem!important}.bootstrap-dark .pr-md-3,.bootstrap-dark .px-md-3{padding-right:1rem!important}.bootstrap-dark .pb-md-3,.bootstrap-dark .py-md-3{padding-bottom:1rem!important}.bootstrap-dark .pl-md-3,.bootstrap-dark .px-md-3{padding-left:1rem!important}.bootstrap-dark .p-md-4{padding:1.5rem!important}.bootstrap-dark .pt-md-4,.bootstrap-dark .py-md-4{padding-top:1.5rem!important}.bootstrap-dark .pr-md-4,.bootstrap-dark .px-md-4{padding-right:1.5rem!important}.bootstrap-dark .pb-md-4,.bootstrap-dark .py-md-4{padding-bottom:1.5rem!important}.bootstrap-dark .pl-md-4,.bootstrap-dark .px-md-4{padding-left:1.5rem!important}.bootstrap-dark .p-md-5{padding:3rem!important}.bootstrap-dark .pt-md-5,.bootstrap-dark .py-md-5{padding-top:3rem!important}.bootstrap-dark .pr-md-5,.bootstrap-dark .px-md-5{padding-right:3rem!important}.bootstrap-dark .pb-md-5,.bootstrap-dark .py-md-5{padding-bottom:3rem!important}.bootstrap-dark .pl-md-5,.bootstrap-dark .px-md-5{padding-left:3rem!important}.bootstrap-dark .m-md-n1{margin:-.25rem!important}.bootstrap-dark .mt-md-n1,.bootstrap-dark .my-md-n1{margin-top:-.25rem!important}.bootstrap-dark .mr-md-n1,.bootstrap-dark .mx-md-n1{margin-right:-.25rem!important}.bootstrap-dark .mb-md-n1,.bootstrap-dark .my-md-n1{margin-bottom:-.25rem!important}.bootstrap-dark .ml-md-n1,.bootstrap-dark .mx-md-n1{margin-left:-.25rem!important}.bootstrap-dark .m-md-n2{margin:-.5rem!important}.bootstrap-dark .mt-md-n2,.bootstrap-dark .my-md-n2{margin-top:-.5rem!important}.bootstrap-dark .mr-md-n2,.bootstrap-dark .mx-md-n2{margin-right:-.5rem!important}.bootstrap-dark .mb-md-n2,.bootstrap-dark .my-md-n2{margin-bottom:-.5rem!important}.bootstrap-dark .ml-md-n2,.bootstrap-dark .mx-md-n2{margin-left:-.5rem!important}.bootstrap-dark .m-md-n3{margin:-1rem!important}.bootstrap-dark .mt-md-n3,.bootstrap-dark .my-md-n3{margin-top:-1rem!important}.bootstrap-dark .mr-md-n3,.bootstrap-dark .mx-md-n3{margin-right:-1rem!important}.bootstrap-dark .mb-md-n3,.bootstrap-dark .my-md-n3{margin-bottom:-1rem!important}.bootstrap-dark .ml-md-n3,.bootstrap-dark .mx-md-n3{margin-left:-1rem!important}.bootstrap-dark .m-md-n4{margin:-1.5rem!important}.bootstrap-dark .mt-md-n4,.bootstrap-dark .my-md-n4{margin-top:-1.5rem!important}.bootstrap-dark .mr-md-n4,.bootstrap-dark .mx-md-n4{margin-right:-1.5rem!important}.bootstrap-dark .mb-md-n4,.bootstrap-dark .my-md-n4{margin-bottom:-1.5rem!important}.bootstrap-dark .ml-md-n4,.bootstrap-dark .mx-md-n4{margin-left:-1.5rem!important}.bootstrap-dark .m-md-n5{margin:-3rem!important}.bootstrap-dark .mt-md-n5,.bootstrap-dark .my-md-n5{margin-top:-3rem!important}.bootstrap-dark .mr-md-n5,.bootstrap-dark .mx-md-n5{margin-right:-3rem!important}.bootstrap-dark .mb-md-n5,.bootstrap-dark .my-md-n5{margin-bottom:-3rem!important}.bootstrap-dark .ml-md-n5,.bootstrap-dark .mx-md-n5{margin-left:-3rem!important}.bootstrap-dark .m-md-auto{margin:auto!important}.bootstrap-dark .mt-md-auto,.bootstrap-dark .my-md-auto{margin-top:auto!important}.bootstrap-dark .mr-md-auto,.bootstrap-dark .mx-md-auto{margin-right:auto!important}.bootstrap-dark .mb-md-auto,.bootstrap-dark .my-md-auto{margin-bottom:auto!important}.bootstrap-dark .ml-md-auto,.bootstrap-dark .mx-md-auto{margin-left:auto!important}}@media(min-width:992px){.bootstrap-dark .m-lg-0{margin:0!important}.bootstrap-dark .mt-lg-0,.bootstrap-dark .my-lg-0{margin-top:0!important}.bootstrap-dark .mr-lg-0,.bootstrap-dark .mx-lg-0{margin-right:0!important}.bootstrap-dark .mb-lg-0,.bootstrap-dark .my-lg-0{margin-bottom:0!important}.bootstrap-dark .ml-lg-0,.bootstrap-dark .mx-lg-0{margin-left:0!important}.bootstrap-dark .m-lg-1{margin:.25rem!important}.bootstrap-dark .mt-lg-1,.bootstrap-dark .my-lg-1{margin-top:.25rem!important}.bootstrap-dark .mr-lg-1,.bootstrap-dark .mx-lg-1{margin-right:.25rem!important}.bootstrap-dark .mb-lg-1,.bootstrap-dark .my-lg-1{margin-bottom:.25rem!important}.bootstrap-dark .ml-lg-1,.bootstrap-dark .mx-lg-1{margin-left:.25rem!important}.bootstrap-dark .m-lg-2{margin:.5rem!important}.bootstrap-dark .mt-lg-2,.bootstrap-dark .my-lg-2{margin-top:.5rem!important}.bootstrap-dark .mr-lg-2,.bootstrap-dark .mx-lg-2{margin-right:.5rem!important}.bootstrap-dark .mb-lg-2,.bootstrap-dark .my-lg-2{margin-bottom:.5rem!important}.bootstrap-dark .ml-lg-2,.bootstrap-dark .mx-lg-2{margin-left:.5rem!important}.bootstrap-dark .m-lg-3{margin:1rem!important}.bootstrap-dark .mt-lg-3,.bootstrap-dark .my-lg-3{margin-top:1rem!important}.bootstrap-dark .mr-lg-3,.bootstrap-dark .mx-lg-3{margin-right:1rem!important}.bootstrap-dark .mb-lg-3,.bootstrap-dark .my-lg-3{margin-bottom:1rem!important}.bootstrap-dark .ml-lg-3,.bootstrap-dark .mx-lg-3{margin-left:1rem!important}.bootstrap-dark .m-lg-4{margin:1.5rem!important}.bootstrap-dark .mt-lg-4,.bootstrap-dark .my-lg-4{margin-top:1.5rem!important}.bootstrap-dark .mr-lg-4,.bootstrap-dark .mx-lg-4{margin-right:1.5rem!important}.bootstrap-dark .mb-lg-4,.bootstrap-dark .my-lg-4{margin-bottom:1.5rem!important}.bootstrap-dark .ml-lg-4,.bootstrap-dark .mx-lg-4{margin-left:1.5rem!important}.bootstrap-dark .m-lg-5{margin:3rem!important}.bootstrap-dark .mt-lg-5,.bootstrap-dark .my-lg-5{margin-top:3rem!important}.bootstrap-dark .mr-lg-5,.bootstrap-dark .mx-lg-5{margin-right:3rem!important}.bootstrap-dark .mb-lg-5,.bootstrap-dark .my-lg-5{margin-bottom:3rem!important}.bootstrap-dark .ml-lg-5,.bootstrap-dark .mx-lg-5{margin-left:3rem!important}.bootstrap-dark .p-lg-0{padding:0!important}.bootstrap-dark .pt-lg-0,.bootstrap-dark .py-lg-0{padding-top:0!important}.bootstrap-dark .pr-lg-0,.bootstrap-dark .px-lg-0{padding-right:0!important}.bootstrap-dark .pb-lg-0,.bootstrap-dark .py-lg-0{padding-bottom:0!important}.bootstrap-dark .pl-lg-0,.bootstrap-dark .px-lg-0{padding-left:0!important}.bootstrap-dark .p-lg-1{padding:.25rem!important}.bootstrap-dark .pt-lg-1,.bootstrap-dark .py-lg-1{padding-top:.25rem!important}.bootstrap-dark .pr-lg-1,.bootstrap-dark .px-lg-1{padding-right:.25rem!important}.bootstrap-dark .pb-lg-1,.bootstrap-dark .py-lg-1{padding-bottom:.25rem!important}.bootstrap-dark .pl-lg-1,.bootstrap-dark .px-lg-1{padding-left:.25rem!important}.bootstrap-dark .p-lg-2{padding:.5rem!important}.bootstrap-dark .pt-lg-2,.bootstrap-dark .py-lg-2{padding-top:.5rem!important}.bootstrap-dark .pr-lg-2,.bootstrap-dark .px-lg-2{padding-right:.5rem!important}.bootstrap-dark .pb-lg-2,.bootstrap-dark .py-lg-2{padding-bottom:.5rem!important}.bootstrap-dark .pl-lg-2,.bootstrap-dark .px-lg-2{padding-left:.5rem!important}.bootstrap-dark .p-lg-3{padding:1rem!important}.bootstrap-dark .pt-lg-3,.bootstrap-dark .py-lg-3{padding-top:1rem!important}.bootstrap-dark .pr-lg-3,.bootstrap-dark .px-lg-3{padding-right:1rem!important}.bootstrap-dark .pb-lg-3,.bootstrap-dark .py-lg-3{padding-bottom:1rem!important}.bootstrap-dark .pl-lg-3,.bootstrap-dark .px-lg-3{padding-left:1rem!important}.bootstrap-dark .p-lg-4{padding:1.5rem!important}.bootstrap-dark .pt-lg-4,.bootstrap-dark .py-lg-4{padding-top:1.5rem!important}.bootstrap-dark .pr-lg-4,.bootstrap-dark .px-lg-4{padding-right:1.5rem!important}.bootstrap-dark .pb-lg-4,.bootstrap-dark .py-lg-4{padding-bottom:1.5rem!important}.bootstrap-dark .pl-lg-4,.bootstrap-dark .px-lg-4{padding-left:1.5rem!important}.bootstrap-dark .p-lg-5{padding:3rem!important}.bootstrap-dark .pt-lg-5,.bootstrap-dark .py-lg-5{padding-top:3rem!important}.bootstrap-dark .pr-lg-5,.bootstrap-dark .px-lg-5{padding-right:3rem!important}.bootstrap-dark .pb-lg-5,.bootstrap-dark .py-lg-5{padding-bottom:3rem!important}.bootstrap-dark .pl-lg-5,.bootstrap-dark .px-lg-5{padding-left:3rem!important}.bootstrap-dark .m-lg-n1{margin:-.25rem!important}.bootstrap-dark .mt-lg-n1,.bootstrap-dark .my-lg-n1{margin-top:-.25rem!important}.bootstrap-dark .mr-lg-n1,.bootstrap-dark .mx-lg-n1{margin-right:-.25rem!important}.bootstrap-dark .mb-lg-n1,.bootstrap-dark .my-lg-n1{margin-bottom:-.25rem!important}.bootstrap-dark .ml-lg-n1,.bootstrap-dark .mx-lg-n1{margin-left:-.25rem!important}.bootstrap-dark .m-lg-n2{margin:-.5rem!important}.bootstrap-dark .mt-lg-n2,.bootstrap-dark .my-lg-n2{margin-top:-.5rem!important}.bootstrap-dark .mr-lg-n2,.bootstrap-dark .mx-lg-n2{margin-right:-.5rem!important}.bootstrap-dark .mb-lg-n2,.bootstrap-dark .my-lg-n2{margin-bottom:-.5rem!important}.bootstrap-dark .ml-lg-n2,.bootstrap-dark .mx-lg-n2{margin-left:-.5rem!important}.bootstrap-dark .m-lg-n3{margin:-1rem!important}.bootstrap-dark .mt-lg-n3,.bootstrap-dark .my-lg-n3{margin-top:-1rem!important}.bootstrap-dark .mr-lg-n3,.bootstrap-dark .mx-lg-n3{margin-right:-1rem!important}.bootstrap-dark .mb-lg-n3,.bootstrap-dark .my-lg-n3{margin-bottom:-1rem!important}.bootstrap-dark .ml-lg-n3,.bootstrap-dark .mx-lg-n3{margin-left:-1rem!important}.bootstrap-dark .m-lg-n4{margin:-1.5rem!important}.bootstrap-dark .mt-lg-n4,.bootstrap-dark .my-lg-n4{margin-top:-1.5rem!important}.bootstrap-dark .mr-lg-n4,.bootstrap-dark .mx-lg-n4{margin-right:-1.5rem!important}.bootstrap-dark .mb-lg-n4,.bootstrap-dark .my-lg-n4{margin-bottom:-1.5rem!important}.bootstrap-dark .ml-lg-n4,.bootstrap-dark .mx-lg-n4{margin-left:-1.5rem!important}.bootstrap-dark .m-lg-n5{margin:-3rem!important}.bootstrap-dark .mt-lg-n5,.bootstrap-dark .my-lg-n5{margin-top:-3rem!important}.bootstrap-dark .mr-lg-n5,.bootstrap-dark .mx-lg-n5{margin-right:-3rem!important}.bootstrap-dark .mb-lg-n5,.bootstrap-dark .my-lg-n5{margin-bottom:-3rem!important}.bootstrap-dark .ml-lg-n5,.bootstrap-dark .mx-lg-n5{margin-left:-3rem!important}.bootstrap-dark .m-lg-auto{margin:auto!important}.bootstrap-dark .mt-lg-auto,.bootstrap-dark .my-lg-auto{margin-top:auto!important}.bootstrap-dark .mr-lg-auto,.bootstrap-dark .mx-lg-auto{margin-right:auto!important}.bootstrap-dark .mb-lg-auto,.bootstrap-dark .my-lg-auto{margin-bottom:auto!important}.bootstrap-dark .ml-lg-auto,.bootstrap-dark .mx-lg-auto{margin-left:auto!important}}@media(min-width:1200px){.bootstrap-dark .m-xl-0{margin:0!important}.bootstrap-dark .mt-xl-0,.bootstrap-dark .my-xl-0{margin-top:0!important}.bootstrap-dark .mr-xl-0,.bootstrap-dark .mx-xl-0{margin-right:0!important}.bootstrap-dark .mb-xl-0,.bootstrap-dark .my-xl-0{margin-bottom:0!important}.bootstrap-dark .ml-xl-0,.bootstrap-dark .mx-xl-0{margin-left:0!important}.bootstrap-dark .m-xl-1{margin:.25rem!important}.bootstrap-dark .mt-xl-1,.bootstrap-dark .my-xl-1{margin-top:.25rem!important}.bootstrap-dark .mr-xl-1,.bootstrap-dark .mx-xl-1{margin-right:.25rem!important}.bootstrap-dark .mb-xl-1,.bootstrap-dark .my-xl-1{margin-bottom:.25rem!important}.bootstrap-dark .ml-xl-1,.bootstrap-dark .mx-xl-1{margin-left:.25rem!important}.bootstrap-dark .m-xl-2{margin:.5rem!important}.bootstrap-dark .mt-xl-2,.bootstrap-dark .my-xl-2{margin-top:.5rem!important}.bootstrap-dark .mr-xl-2,.bootstrap-dark .mx-xl-2{margin-right:.5rem!important}.bootstrap-dark .mb-xl-2,.bootstrap-dark .my-xl-2{margin-bottom:.5rem!important}.bootstrap-dark .ml-xl-2,.bootstrap-dark .mx-xl-2{margin-left:.5rem!important}.bootstrap-dark .m-xl-3{margin:1rem!important}.bootstrap-dark .mt-xl-3,.bootstrap-dark .my-xl-3{margin-top:1rem!important}.bootstrap-dark .mr-xl-3,.bootstrap-dark .mx-xl-3{margin-right:1rem!important}.bootstrap-dark .mb-xl-3,.bootstrap-dark .my-xl-3{margin-bottom:1rem!important}.bootstrap-dark .ml-xl-3,.bootstrap-dark .mx-xl-3{margin-left:1rem!important}.bootstrap-dark .m-xl-4{margin:1.5rem!important}.bootstrap-dark .mt-xl-4,.bootstrap-dark .my-xl-4{margin-top:1.5rem!important}.bootstrap-dark .mr-xl-4,.bootstrap-dark .mx-xl-4{margin-right:1.5rem!important}.bootstrap-dark .mb-xl-4,.bootstrap-dark .my-xl-4{margin-bottom:1.5rem!important}.bootstrap-dark .ml-xl-4,.bootstrap-dark .mx-xl-4{margin-left:1.5rem!important}.bootstrap-dark .m-xl-5{margin:3rem!important}.bootstrap-dark .mt-xl-5,.bootstrap-dark .my-xl-5{margin-top:3rem!important}.bootstrap-dark .mr-xl-5,.bootstrap-dark .mx-xl-5{margin-right:3rem!important}.bootstrap-dark .mb-xl-5,.bootstrap-dark .my-xl-5{margin-bottom:3rem!important}.bootstrap-dark .ml-xl-5,.bootstrap-dark .mx-xl-5{margin-left:3rem!important}.bootstrap-dark .p-xl-0{padding:0!important}.bootstrap-dark .pt-xl-0,.bootstrap-dark .py-xl-0{padding-top:0!important}.bootstrap-dark .pr-xl-0,.bootstrap-dark .px-xl-0{padding-right:0!important}.bootstrap-dark .pb-xl-0,.bootstrap-dark .py-xl-0{padding-bottom:0!important}.bootstrap-dark .pl-xl-0,.bootstrap-dark .px-xl-0{padding-left:0!important}.bootstrap-dark .p-xl-1{padding:.25rem!important}.bootstrap-dark .pt-xl-1,.bootstrap-dark .py-xl-1{padding-top:.25rem!important}.bootstrap-dark .pr-xl-1,.bootstrap-dark .px-xl-1{padding-right:.25rem!important}.bootstrap-dark .pb-xl-1,.bootstrap-dark .py-xl-1{padding-bottom:.25rem!important}.bootstrap-dark .pl-xl-1,.bootstrap-dark .px-xl-1{padding-left:.25rem!important}.bootstrap-dark .p-xl-2{padding:.5rem!important}.bootstrap-dark .pt-xl-2,.bootstrap-dark .py-xl-2{padding-top:.5rem!important}.bootstrap-dark .pr-xl-2,.bootstrap-dark .px-xl-2{padding-right:.5rem!important}.bootstrap-dark .pb-xl-2,.bootstrap-dark .py-xl-2{padding-bottom:.5rem!important}.bootstrap-dark .pl-xl-2,.bootstrap-dark .px-xl-2{padding-left:.5rem!important}.bootstrap-dark .p-xl-3{padding:1rem!important}.bootstrap-dark .pt-xl-3,.bootstrap-dark .py-xl-3{padding-top:1rem!important}.bootstrap-dark .pr-xl-3,.bootstrap-dark .px-xl-3{padding-right:1rem!important}.bootstrap-dark .pb-xl-3,.bootstrap-dark .py-xl-3{padding-bottom:1rem!important}.bootstrap-dark .pl-xl-3,.bootstrap-dark .px-xl-3{padding-left:1rem!important}.bootstrap-dark .p-xl-4{padding:1.5rem!important}.bootstrap-dark .pt-xl-4,.bootstrap-dark .py-xl-4{padding-top:1.5rem!important}.bootstrap-dark .pr-xl-4,.bootstrap-dark .px-xl-4{padding-right:1.5rem!important}.bootstrap-dark .pb-xl-4,.bootstrap-dark .py-xl-4{padding-bottom:1.5rem!important}.bootstrap-dark .pl-xl-4,.bootstrap-dark .px-xl-4{padding-left:1.5rem!important}.bootstrap-dark .p-xl-5{padding:3rem!important}.bootstrap-dark .pt-xl-5,.bootstrap-dark .py-xl-5{padding-top:3rem!important}.bootstrap-dark .pr-xl-5,.bootstrap-dark .px-xl-5{padding-right:3rem!important}.bootstrap-dark .pb-xl-5,.bootstrap-dark .py-xl-5{padding-bottom:3rem!important}.bootstrap-dark .pl-xl-5,.bootstrap-dark .px-xl-5{padding-left:3rem!important}.bootstrap-dark .m-xl-n1{margin:-.25rem!important}.bootstrap-dark .mt-xl-n1,.bootstrap-dark .my-xl-n1{margin-top:-.25rem!important}.bootstrap-dark .mr-xl-n1,.bootstrap-dark .mx-xl-n1{margin-right:-.25rem!important}.bootstrap-dark .mb-xl-n1,.bootstrap-dark .my-xl-n1{margin-bottom:-.25rem!important}.bootstrap-dark .ml-xl-n1,.bootstrap-dark .mx-xl-n1{margin-left:-.25rem!important}.bootstrap-dark .m-xl-n2{margin:-.5rem!important}.bootstrap-dark .mt-xl-n2,.bootstrap-dark .my-xl-n2{margin-top:-.5rem!important}.bootstrap-dark .mr-xl-n2,.bootstrap-dark .mx-xl-n2{margin-right:-.5rem!important}.bootstrap-dark .mb-xl-n2,.bootstrap-dark .my-xl-n2{margin-bottom:-.5rem!important}.bootstrap-dark .ml-xl-n2,.bootstrap-dark .mx-xl-n2{margin-left:-.5rem!important}.bootstrap-dark .m-xl-n3{margin:-1rem!important}.bootstrap-dark .mt-xl-n3,.bootstrap-dark .my-xl-n3{margin-top:-1rem!important}.bootstrap-dark .mr-xl-n3,.bootstrap-dark .mx-xl-n3{margin-right:-1rem!important}.bootstrap-dark .mb-xl-n3,.bootstrap-dark .my-xl-n3{margin-bottom:-1rem!important}.bootstrap-dark .ml-xl-n3,.bootstrap-dark .mx-xl-n3{margin-left:-1rem!important}.bootstrap-dark .m-xl-n4{margin:-1.5rem!important}.bootstrap-dark .mt-xl-n4,.bootstrap-dark .my-xl-n4{margin-top:-1.5rem!important}.bootstrap-dark .mr-xl-n4,.bootstrap-dark .mx-xl-n4{margin-right:-1.5rem!important}.bootstrap-dark .mb-xl-n4,.bootstrap-dark .my-xl-n4{margin-bottom:-1.5rem!important}.bootstrap-dark .ml-xl-n4,.bootstrap-dark .mx-xl-n4{margin-left:-1.5rem!important}.bootstrap-dark .m-xl-n5{margin:-3rem!important}.bootstrap-dark .mt-xl-n5,.bootstrap-dark .my-xl-n5{margin-top:-3rem!important}.bootstrap-dark .mr-xl-n5,.bootstrap-dark .mx-xl-n5{margin-right:-3rem!important}.bootstrap-dark .mb-xl-n5,.bootstrap-dark .my-xl-n5{margin-bottom:-3rem!important}.bootstrap-dark .ml-xl-n5,.bootstrap-dark .mx-xl-n5{margin-left:-3rem!important}.bootstrap-dark .m-xl-auto{margin:auto!important}.bootstrap-dark .mt-xl-auto,.bootstrap-dark .my-xl-auto{margin-top:auto!important}.bootstrap-dark .mr-xl-auto,.bootstrap-dark .mx-xl-auto{margin-right:auto!important}.bootstrap-dark .mb-xl-auto,.bootstrap-dark .my-xl-auto{margin-bottom:auto!important}.bootstrap-dark .ml-xl-auto,.bootstrap-dark .mx-xl-auto{margin-left:auto!important}}.bootstrap-dark .stretched-link:after{background-color:#0000;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.bootstrap-dark .text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.bootstrap-dark .text-justify{text-align:justify!important}.bootstrap-dark .text-wrap{white-space:normal!important}.bootstrap-dark .text-nowrap{white-space:nowrap!important}.bootstrap-dark .text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bootstrap-dark .text-left{text-align:left!important}.bootstrap-dark .text-right{text-align:right!important}.bootstrap-dark .text-center{text-align:center!important}@media(min-width:576px){.bootstrap-dark .text-sm-left{text-align:left!important}.bootstrap-dark .text-sm-right{text-align:right!important}.bootstrap-dark .text-sm-center{text-align:center!important}}@media(min-width:768px){.bootstrap-dark .text-md-left{text-align:left!important}.bootstrap-dark .text-md-right{text-align:right!important}.bootstrap-dark .text-md-center{text-align:center!important}}@media(min-width:992px){.bootstrap-dark .text-lg-left{text-align:left!important}.bootstrap-dark .text-lg-right{text-align:right!important}.bootstrap-dark .text-lg-center{text-align:center!important}}@media(min-width:1200px){.bootstrap-dark .text-xl-left{text-align:left!important}.bootstrap-dark .text-xl-right{text-align:right!important}.bootstrap-dark .text-xl-center{text-align:center!important}}.bootstrap-dark .text-lowercase{text-transform:lowercase!important}.bootstrap-dark .text-uppercase{text-transform:uppercase!important}.bootstrap-dark .text-capitalize{text-transform:capitalize!important}.bootstrap-dark .font-weight-light{font-weight:300!important}.bootstrap-dark .font-weight-lighter{font-weight:lighter!important}.bootstrap-dark .font-weight-normal{font-weight:400!important}.bootstrap-dark .font-weight-bold{font-weight:700!important}.bootstrap-dark .font-weight-bolder{font-weight:bolder!important}.bootstrap-dark .font-italic{font-style:italic!important}.bootstrap-dark .text-white{color:#fff!important}.bootstrap-dark .text-primary{color:#007bff!important}.bootstrap-dark a.text-primary:focus,.bootstrap-dark a.text-primary:hover{color:#0056b3!important}.bootstrap-dark .text-secondary{color:#6c757d!important}.bootstrap-dark a.text-secondary:focus,.bootstrap-dark a.text-secondary:hover{color:#494f54!important}.bootstrap-dark .text-success{color:#28a745!important}.bootstrap-dark a.text-success:focus,.bootstrap-dark a.text-success:hover{color:#19692c!important}.bootstrap-dark .text-info{color:#17a2b8!important}.bootstrap-dark a.text-info:focus,.bootstrap-dark a.text-info:hover{color:#0f6674!important}.bootstrap-dark .text-warning{color:#ffc107!important}.bootstrap-dark a.text-warning:focus,.bootstrap-dark a.text-warning:hover{color:#ba8b00!important}.bootstrap-dark .text-danger{color:#dc3545!important}.bootstrap-dark a.text-danger:focus,.bootstrap-dark a.text-danger:hover{color:#a71d2a!important}.bootstrap-dark .text-light{color:#f8f9fa!important}.bootstrap-dark a.text-light:focus,.bootstrap-dark a.text-light:hover{color:#cbd3da!important}.bootstrap-dark .text-dark{color:#343a40!important}.bootstrap-dark a.text-dark:focus,.bootstrap-dark a.text-dark:hover{color:#121416!important}.bootstrap-dark .text-body{color:#d3d3d3!important}.bootstrap-dark .text-muted{color:#6c757d!important}.bootstrap-dark .text-black-50{color:#00000080!important}.bootstrap-dark .text-white-50{color:#ffffff80!important}.bootstrap-dark .text-hide{background-color:initial;border:0;color:#0000;font:0/0 a;text-shadow:none}.bootstrap-dark .text-decoration-none{text-decoration:none!important}.bootstrap-dark .text-break{word-wrap:break-word!important;word-break:break-word!important}.bootstrap-dark .text-reset{color:inherit!important}.bootstrap-dark .visible{visibility:visible!important}.bootstrap-dark .invisible{visibility:hidden!important}.bootstrap-dark .alert-cell{background:#212529;color:#fff}.bootstrap-dark .rule-cell{background-color:#212529}.bootstrap-dark .config-yaml{background-color:#adb5bd;border:1px solid #495057;border-radius:4px;color:#000;display:block;font-size:13px;padding:10px;word-break:break-all}.bootstrap-dark .query-stats{color:#6c757d;flex-grow:1;font-size:.7rem}.bootstrap-dark .metrics-explorer.modal-dialog{max-width:750px;overflow-wrap:break-word}.bootstrap-dark .metrics-explorer .metric{cursor:pointer;margin:0;padding:5px}.bootstrap-dark .metrics-explorer .metric:hover{background:#212529}.bootstrap-dark button.metrics-explorer-btn{background-color:#343a40;border:1px solid #6c757d;color:#dee2e6}.bootstrap-dark .graph-controls button.clear-time-btn,.bootstrap-dark .table-controls button.clear-time-btn{background-color:#000;border:1px solid #6c757d;border-left:none}.bootstrap-dark .graph-controls button.clear-time-btn:hover,.bootstrap-dark .table-controls button.clear-time-btn:hover{color:#545b62}.bootstrap-dark button.execute-btn{border:1px solid #1a88ff;width:84px}.bootstrap-dark .expression-input .cm-expression-input{border:1px solid #6c757d;flex:1 1 auto;font-size:15px;padding:4px 0 0 8px}.bootstrap-dark .tab-content{border-bottom:1px solid hsla(0,0%,100%,.125);border-left:1px solid hsla(0,0%,100%,.125);border-right:1px solid hsla(0,0%,100%,.125);padding:10px}.bootstrap-dark .modal.show{overflow-y:auto}.bootstrap-dark .panel{margin-bottom:20px}.bootstrap-dark input[type=checkbox]:checked+label{color:#286090}.bootstrap-dark .custom-control-label{cursor:pointer}.bootstrap-dark .togglers-wrapper .form-group{margin-bottom:.5rem}.bootstrap-dark [for$=-toggler].custom-control-label:after,.bootstrap-dark [for$=-toggler].custom-control-label:before{height:1.12rem;left:-1.3rem;top:.28rem;width:1.12rem}.bootstrap-dark .capitalize-title:first-letter{text-transform:capitalize}.bootstrap-dark .input-group.expression-input{flex-wrap:nowrap;margin-bottom:10px}.bootstrap-dark .alert.alert-danger{margin-bottom:10px}.bootstrap-dark .nav-tabs .nav-link{cursor:pointer}.bootstrap-dark .tab-content .alert{margin-bottom:0}.bootstrap-dark .data-table.table{margin:10px 0 2px}.bootstrap-dark .data-table>tbody>tr>td{font-size:.8em;overflow:hidden;padding:5px 0 5px 8px}.bootstrap-dark .autosuggest-dropdown{background-color:#fff;border:1px solid #ced4da;color:#495057;font-size:1rem;left:56px;margin-top:-6px;position:absolute;z-index:1000}.bootstrap-dark .autosuggest-dropdown-list{list-style:none;margin:0;padding:0}.bootstrap-dark .autosuggest-dropdown-list li{background-color:initial;border:0;clear:both;display:block;padding:.25rem 1.5rem;white-space:nowrap;width:100%}.bootstrap-dark .autosuggest-dropdown-list li.autosuggest-dropdown-header{background-color:#bfdeff;font-size:10px;line-height:1.5;text-align:center;text-transform:uppercase}.bootstrap-dark .graph-controls,.bootstrap-dark .table-controls{margin-bottom:10px}.bootstrap-dark .graph-controls input,.bootstrap-dark .table-controls input{text-align:center}.bootstrap-dark .graph-controls .range-input input{width:50px}.bootstrap-dark .time-input input{border-right:none}.bootstrap-dark .time-input{width:270px!important}.bootstrap-dark .graph-controls input.resolution-input{width:90px}.bootstrap-dark .graph-controls>:not(:first-child){margin-left:20px}.bootstrap-dark .graph-legend{display:inline-block;font-size:.75em;margin:15px 0 15px 55px;padding:10px 5px}.bootstrap-dark .legend-item{border-radius:3px;cursor:pointer;display:flex;line-height:1.7;padding:0 5px}.bootstrap-dark .legend-item div{flex-wrap:wrap}.bootstrap-dark .legend-swatch{display:inline-block;height:7px;margin:6px 8px 2px 0;min-width:7px;outline:1.5px solid #ccc;outline-offset:1px}.bootstrap-dark .legend-item:hover{background:#0000002e}.bootstrap-dark .legend-metric-name{margin-right:1px}.bootstrap-dark .legend-label-name{font-weight:700}.bootstrap-dark .graph{margin:0 5px}.bootstrap-dark .graph-chart{fill:#495057;font-size:.8em;height:500px;width:100%}.bootstrap-dark .graph-chart .flot-overlay{cursor:crosshair}.bootstrap-dark .graph-tooltip{background:#000c;border-radius:3px;color:#fff;font-family:Arial,Helvetica,sans-serif;font-size:12px;padding:8px;white-space:nowrap}.bootstrap-dark .graph-tooltip .labels{font-size:11px;line-height:11px}.bootstrap-dark .graph-tooltip .detail-swatch{display:inline-block;height:10px;width:10px}.bootstrap-dark .add-panel-btn{margin-bottom:20px}.bootstrap-dark .target-head{font-size:large;font-weight:700}.bootstrap-dark .group-info{display:flex;justify-content:space-between;margin-bottom:10px;padding:10px}.bootstrap-dark .badges-wrapper>span{margin-right:5px;max-height:20px}.bootstrap-dark .rules-head{font-weight:600}.bootstrap-dark .rule_cell{background-color:#f5f5f5;display:block;font-family:monospace;white-space:pre-wrap}.bootstrap-dark .popup-message{background-color:#000000b3;border-radius:4px;color:#fff;display:none;font-size:14px;margin-right:15px;max-width:250px;min-width:120px;padding:8px 12px;position:absolute;right:100%;top:50%;transform:translateY(-50%);white-space:normal;width:-webkit-max-content;width:max-content}.bootstrap-dark .custom-control-label:hover .popup-message{display:block} +/*# sourceMappingURL=main.17d667f4.css.map*/ \ No newline at end of file diff --git a/pkg/ui/static/react/static/css/main.17d667f4.css.map b/pkg/ui/static/react/static/css/main.17d667f4.css.map new file mode 100644 index 0000000000..0350e3546e --- /dev/null +++ b/pkg/ui/static/react/static/css/main.17d667f4.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.17d667f4.css","mappings":"AAAA;;;;EAIE,CAAC,yxBAAk3B,kBAAkB,CAAC,QAAO,CAA3E,UAAU,CAAC,WAAW,CAAW,eAAe,CAAzB,SAAS,CAA5D,iBAAiB,CAAC,SAAsF,CAAC,4HAA4H,wBAAwB,CAAC,6DAA6D,2BAA2B,CAAC,qEAAiI,QAAQ,CAAC,wBAAuB,CAA/C,MAAM,CAAnD,iBAAiB,CAAmC,OAAO,CAApB,KAAK,CAA1B,oBAA2E,CAAC,2DAA2D,cAAc,CAAC,iCAAiC,eAAe,CAAC,+CAA+C,aAAa,CAAC,YAAY,CAAC,WAAW,CAAC,WAAW,CAA6H,iOAAiH,WAAW,CAAC,kLAAkL,WAAW,CAAC,yBAAyB,8DAA8D,UAAU,CAAC,CAAC,yBAAyB,8DAA8D,UAAU,CAAC,CAAC,yBAAyB,8DAA8D,UAAU,CAAC,CAAC,2GAA2G,UAAU,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,6DAA+J,6BAAkC,CAApI,2BAAiC,CAAC,4BAAkC,CAA0E,QAAO,CAAhB,QAAiB,CAAC,4DAAiI,4BAA4B,CAAjG,2BAAiC,CAAC,4BAAkC,CAAuC,QAAO,CAAhB,QAAiB,CAAC,0DAA0D,2BAAiC,CAAC,4BAAkC,CAA2B,0BAA+B,CAAC,WAAW,CAAC,QAAQ,CAAC,yDAAyD,2BAAiC,CAAC,4BAAkC,CAAC,yBAAyB,CAAC,WAAW,CAAC,QAAQ,CAAC,kEAAkE,SAAS,CAAC,SAAS,CAAC,iEAAiE,SAAS,CAAC,SAAS,CAAC,qDAAqD,WAAW,CAAC,gDAAgD,QAAQ,CAAC,gDAAgD,aAAa,CAAC,uDAAuD,eAAe,CAAC,0JAAqL,eAAe,CAA/B,eAAe,CAAiB,QAAO,CAAlD,UAAmD,CAAC,qDAAqD,WAAW,CAAC,gEAAkF,+JAA6K,CAAY,WAAU,CAArN,iBAAiB,CAA+K,UAAsB,CAAC,wEAAyE,yBAAyB,CAAC,0EAA2E,2BAA2B,CAAC,wEAAyE,yBAAyB,CAAC,0EAA2E,2BAA2B,CAAC,mEAAoE,oBAAoB,CAAC,qEAAsE,sBAAsB,CAAC,sEAAuE,sBAAsB,CAAC,+DAAgE,0BAA0B,CAAC,+DAAgE,+BAA+B,CAAC,gDAAgD,iBAAiB,CAAC,sDAAuD,sCAAsC,CAAC,mDAAsE,WAAW,CAAY,mBAAkB,CAAlD,QAAQ,CAAlB,SAAS,CAAsB,UAA8B,CAAC,wDAAwE,YAAY,CAA5B,eAAe,CAAc,UAAU,CAAC,0FAA0G,YAAW,CAA3B,eAA4B,CAAC,uCAAkD,QAAO,CAAlB,UAAmB,CAAC,oFAAsG,oBAAmB,CAArC,iBAAsC,CAAC,0CAA0C,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,wDAAwD,WAAW,CAAC,4GAA4G,cAAc,CAAC,aAAa,CAAC,kBAAkB,CAAC,qDAAsD,wBAAwB,CAAC,qDAAsD,oBAAoB,CAAC,+DAA+D,cAAc,CAAC,qEAAqE,kBAAkB,CAAC,0CAA0C,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,6CAAyF,aAAa,CAAC,cAAa,CAAvE,cAAc,CAAC,WAAW,CAAC,gBAA6C,CAAC,8CAA8C,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,uNAAuN,kBAAkB,CAAC,cAAc,CAAC,4FAA4F,aAAa,CAAC,gDAAgD,iBAAiB,CAAC,uDAAqK,gCAA+B,CAA/B,kBAA+B,CAA/B,wBAA+B,CAAmB,UAAU,CAA1K,UAAU,CAAC,oBAAoB,CAA+G,iBAAiB,CAAY,SAAS,CAAC,wGAAwG,wBAAwB,CAAC,UAAU,CAAC,8BAAoC,CAAC,8DAA8D,wBAAwB,CAAC,4GAA4G,cAAc,CAAC,aAAa,CAAC,kBAAkB,CAAC,+CAA4J,oBAAmB,CAAlC,cAAc,CAA5G,oBAAoB,CAAY,WAAW,CAAC,gBAAgB,CAAgB,iBAAiB,CAAhC,cAAc,CAAtD,UAA4G,CAAC,qDAAqD,kBAAkB,CAAC,sDAAsD,wBAAwB,CAAC,UAAU,CAAC,8BAAoC,CAAC,mDAAmD,aAAa,CAAC,sHAAsH,cAAc,CAAC,aAAa,CAAC,kBAAkB,CAAC,uDAAuD,WAAW,CAAC,gBAAgB,CAAC,sEAAoF,aAAwB,CAAxB,yBAAyB,CAAC,4EAA4E,aAAa,CAAC,87CAAk9C,cAAa,CAAjC,mBAAkC,CAAC,khDAAkhD,cAAc,CAAC,0CAA0C,cAAc,CCJt8W,kCACE,gBACF,CAEA,8BAGE,cAAe,CAFf,cAAe,CACf,eAEF,CAMA,+BAEE,aACF,CAEA,8BACE,UACF,CAEA,6BAEE,oBAAqB,CADrB,WAAY,CAEZ,oBACF,CAEA,iEAEE,SACF,CAEA,kEAEE,SACF,CAEA,+BAEE,SACF,CC1CA,gCACE,kBACF,CCFA,2BAEI,WAAY,CADZ,UAMJ,CCPA,2DDMI,kBAAmB,CAHnB,YAAa,CACb,qBAAsB,CACtB,sBCCJ,CANA,gCAEE,gBAIF,CAEA,uCACE,eAAgB,CAChB,YACF,CAEA,+BAEE,qBAAsB,CADtB,oBAEF,CChBA,yBAEE,UAAW,CADX,YAAa,CAEb,mCAAoC,CACpC,iBAAkB,CAClB,SACF,CAEA,oBACE,UACF,CAEA,uBACE,qCAAwC,CACxC,eAAgB,CAChB,6BAAoC,CACpC,oBACF,CAEA,0CACE,SACF,CAEA,gDACE,wBAAyB,CACzB,iBACF,CAEA,4BAME,qBAAsB,CAGtB,kBAAmB,CADnB,gBAAiB,CAHjB,cAAe,CADf,WAAY,CAFZ,iBAAkB,CAClB,eAAgB,CAIhB,8BAAgC,CANhC,OASF,CAEA,+CAGE,oDAA0E,CAF1E,eAAgB,CAChB,WAEF,CAEA,0BAIE,kBAAmB,CAFnB,YAAa,CAGb,sBAAuB,CAFvB,6BAA8B,CAF9B,UAKF,CAEA,sBAIE,eAAgB,CADhB,eAAgB,CAFhB,QAAS,CACT,SAGF,CAEA,wBAEE,eAAgB,CADhB,WAAY,CAEZ,aAAc,CACd,0BACF,CAEA,4BAME,kBAAmB,CALnB,qBAAsB,CAEtB,YAAa,CAEb,qBAAsB,CAEtB,iBAAkB,CAHlB,4BAA6B,CAF7B,aAMF,CAEA,yBAIE,cAAgB,CAFhB,6BAIF,CAEA,+CALE,kBAAmB,CAFnB,YAAa,CAIb,UAOF,CAEA,qBACE,qBAAsB,CACtB,aACF,CAEA,0BAOE,qBAAsB,CANtB,aAAc,CAEd,QAAS,CAGT,eAAgB,CAFhB,iBAAkB,CAClB,sBAAuB,CAHvB,SAMF,CAEA,6BAKE,0BAA2B,CAD3B,qBAAsB,CAHtB,YAAa,CACb,qBAAsB,CACtB,UAGF,CAEA,mBAGE,oBAAqB,CAErB,kBAAuB,CADvB,0BAA2B,CAE3B,aAAe,CACf,iBAAkB,CALlB,iBAAkB,CADlB,UAOF,CAEA,yBAEE,WAAY,CAMZ,qBAAsB,CALtB,WAAY,CAGZ,QAAS,CAFT,aAAe,CAGf,WAAY,CAEZ,uBAAwB,CAJxB,SAAU,CAJV,iBASF,CAEA,8DAGE,sCAAiD,CADjD,YAEF,CAMA,qBACE,iBAAkB,CAClB,iBAAkB,CAClB,iBAAkB,CAClB,iBAAkB,CAClB,iBAAkB,CAClB,iBACF,CAEA,0BACE,iBAAkB,CAClB,iBAAkB,CAClB,iBAAkB,CAClB,iBAAkB,CAClB,iBAAkB,CAClB,iBACF,CAEA,2BACE,iBAAkB,CAClB,iBAAkB,CAClB,iBAAkB,CAClB,iBAAkB,CAClB,cAAkB,CAClB,iBACF,CAEA,uBACE,yBACF,CACA,uBACE,yBACF,CACA,uBACE,yBACF,CACA,uBACE,yBACF,CACA,uBACE,yBACF,CACA,uBACE,yBACF,CAEA,0BACE,kBACF,CAEA,2BAGE,kBAAmB,CAFnB,YAAa,CACb,kBAEF,CCzMA,WAKE,iBAAkB,CAHlB,WAAY,CACZ,aAAc,CAFd,iBAAkB,CAKlB,iBAAkB,CAFlB,UAKF,CACA,wBAFE,yCAA6C,CAD7C,qBAMF,CACA,gBAGE,wBAAyB,CADzB,UAIF,CACA,iCAFE,iBAAkB,CADlB,UAAW,CAHX,iBAYF,CANA,iBAKE,wBAAyB,CAHzB,MAIF,CACA,kBAUE,qBAAsB,CADtB,wBAAyB,CADzB,iBAAkB,CAJlB,cAAe,CACf,mBAAoB,CAEpB,WAAY,CAJZ,WAAY,CAGZ,eAAgB,CALhB,iBAAkB,CAUlB,kBAAmB,CATnB,UAUF,CACA,+EACE,oBAAqB,CACrB,4BACF,CACA,wBACE,YACF,CACA,sCACE,oBAAqB,CACrB,gBACF,CACA,wBACE,oBACF,CACA,yBACE,oBAAqB,CACrB,0BAA2B,CAE3B,eACF,CACA,gBAKE,cAAe,CAFf,MAAO,CAFP,iBAAkB,CAClB,QAAS,CAET,UAEF,CACA,qBAME,UAAW,CADX,cAAe,CAHf,oBAAqB,CADrB,iBAAkB,CAGlB,iBAAkB,CADlB,qBAIF,CACA,4BACE,UACF,CACA,gBAIE,gBAAuB,CADvB,UAAW,CAFX,iBAAkB,CAClB,UAGF,CACA,eAOE,qBAAsB,CADtB,wBAAyB,CAGzB,iBAAkB,CAPlB,WAAY,CAMZ,cAAe,CAHf,UAAW,CAFX,gBAAiB,CAFjB,iBAAkB,CASlB,qBAAsB,CANtB,SAOF,CACA,sBACE,oBACF,CACA,uBACE,iBACF,CACA,oBACE,wBACF,CACA,qCACE,qBACF,CACA,yEAIE,qBAAsB,CAFtB,iBAAkB,CAClB,eAAgB,CAEhB,kBACF,CACA,4EAEE,4BACF,CACA,oBAEE,WAAY,CACZ,aAAc,CAFd,UAGF,CACA,oCACE,WAAY,CACZ,SACF,CACA,qCAEE,QAAS,CADT,QAAS,CAET,SACF,CACA,sCACE,gBAAiB,CACjB,kBACF,CACA,oCAGE,WAAY,CADZ,SAAU,CADV,KAGF,CACA,oCACE,WAAY,CACZ,SACF,CACA,mCACE,QAAS,CACT,kBACF,CAIA,6FACE,kBACF,CAQA,0GACE,sBAAwB,CACxB,wBAAyB,CAEzB,2BAA4B,CAD5B,uBAEF,CACA,0JAEE,wCAAyC,CACzC,4BACF,CACA,4EACE,yCAA0C,CAC1C,4BACF,CACA,uEAGE,mDAAyD,CADzD,kBAEF,CACA,mCACE,yDACF,CACA,qCACE,GACE,SAAU,CAEV,kBAAsB,CADtB,yBAEF,CACA,GAEE,kBAAsB,CADtB,yBAEF,CACF,CACA,sCACE,GAEE,kBAAsB,CADtB,yBAEF,CACA,GACE,SAAU,CAEV,kBAAsB,CADtB,yBAEF,CACF,CACA,mBAEE,YAAa,CADb,iBAAkB,CAElB,WAAY,CACZ,kBAGF,CACA,wCAFE,yCAA6C,CAD7C,qBAMF,CACA,0BACE,YACF,CACA,iCACE,iBACF,CACA,yBASE,wBAAyB,CACzB,iBAAkB,CAClB,0BAA2B,CAL3B,UAAW,CAFX,cAAe,CADf,WAAY,CAEZ,aAAc,CAHd,cAAe,CADf,eAAgB,CAMhB,iBAAkB,CAClB,oBAIF,CACA,yBAIE,kBAAyB,CACzB,kBAAmB,CAFnB,QAAS,CAFT,iBAAkB,CAClB,OAIF,CACA,0DAKE,wBAAyB,CADzB,sBAAuB,CAHvB,UAAW,CACX,QAAS,CACT,gBAGF,CCpPE,KAGE,wBAIF,WACE,oBACA,iGClBJ,iBCkBA,qBAGE,CAOA,sEAMF,aACE,MAiBA,sBCgP4B,aApRnB,CD8BT,wLCsO4B,eChGxB,gBD2GwB,gBAKA,CDvP9B,QACE,CC9BS,eATA,2CD0DX,mBACE,IASF,kBACE,SACA,iBACA,mBAcA,oBADF,YCkN8B,GDxM5B,mBADF,YCsF4B,uCDrE1B,eACA,CAFA,WACA,CAJF,yBAEE,yCACA,CADA,gCACA,CAEA,mEACA,SAIA,iBACA,oBACA,kBAHF,kBAUE,CAPA,SAGF,YAIE,yBAGF,eAIE,IAGF,eCkJ8B,ID9I9B,mBACE,cACA,YAGF,eACE,UAGF,kBCsI8B,ODjI9B,aEII,SFOF,aEPE,cFSF,CAJF,iBAEE,CAEA,sBACA,KAGF,kBACA,YCF0C,yBDS1C,aCV0C,qBDaxC,SGhLA,aFqKwC,0BACA,CDyBxC,4DG/LA,aHkME,qBACA,mBASJ,sFC6D8B,cCjH1B,KFkEF,6BAJA,kBAEA,CAJF,YAEE,CAEA,aAKA,QAQF,eAEE,KASA,iBACA,SAFF,qBASE,CAPA,IAGF,eAIE,OAQF,wBACE,SAOA,oBC0E4B,aAjVnB,CAiVmB,sBD9E9B,kBC8E8B,CAjVnB,eDwQT,IAOF,kBAEE,gCACA,OAQF,oBAEE,oBC4JsC,QDrJxC,eAEE,kCAQF,SACE,uCAQA,mBACA,kBEhKE,qBF0JJ,QAQE,cAGF,gBAEE,eAGF,mBAEE,eAMF,cACE,QAMF,gBACE,iDAOF,yBAIE,6GASE,cACE,yHAUJ,kBAJF,SAKE,wCAGF,qBAEE,UACA,UAIF,aACE,gBAEA,UAYA,SADA,QACA,CATF,WAME,UAIA,QAYA,aACA,CARF,aACE,CAIA,gBE9OI,oBFgPJ,CAHA,mBACA,CAHA,cACA,UACA,CAIA,mBAPA,UAQA,UAGF,sBACE,mFAIF,WAEE,eAQA,wBALF,mBAME,0CAOF,uBACE,8BASA,0BADF,YAEE,QAOF,oBACE,SAIA,eADF,iBAEE,UAGF,YACE,UAKF,sBACE,gBIrcA,sBHuQ4B,aApRnB,CGOT,wLH6P4B,eChGxB,gBD2GwB,gBAKA,CG9Q9B,QACE,CHPS,eATA,kBIPX,cAGI,iNAIA,yIAIA,+SAKF,uGACA,+KJ4R4B,eAEA,iBKzS9B,mBL0S8B,8BKjS9B,gBJqKM,8BIpKN,cJoKM,8BInKN,iBJmKM,8BIlKN,gBJkKM,8BIjKN,iBJiKM,8BIhKN,cJgKM,kBI9JN,iBJ8JM,gBD2IwB,uBKnS9B,cJwJM,gBDoIwB,gBARA,uBK/Q9B,gBJmJM,gBDqIwB,gBATA,uBK1Q9B,gBJ8IM,gBDsIwB,gBAVA,uBKrQ9B,gBJyIM,gBDuIwB,gBAXA,eAzKrB,QK9EP,gCL8EO,mBKjFT,eAIE,oCAQF,aJkGI,gBD2H0B,kCA6CA,yBKpQ9B,YL6Q8B,CMhV5B,kDADA,gBDoFF,cCnFE,8BDsFF,oBACE,+CAEA,kBLqP4B,wBK1O9B,aJ2DI,yBIzDF,wBL4BO,kBKxBT,kBJqEM,+BAhBF,cIhDJ,aACE,cLxGS,sCK4GT,YACE,CE5GF,gDAHA,YCJF,cDOE,2BPogCkC,qBA3gCzB,yBQST,qBCEE,CDLJ,cDCE,oBCcF,oBAEE,wBAIA,cADF,mBAEE,4BPiIE,cO9HJ,aRzBW,iBAyBD,qBC8HN,aD9HM,CUrCV,eAGE,mBAGA,aACE,gBVDO,wBASA,qBCoJP,UD7JO,CUOT,eTsJE,CSvJJ,mBDKI,oBCIA,cT8IA,iBS/IF,SV2Q4B,gBC5H1B,cStIJ,aACE,gBVfS,qBCoJP,aS9HA,CAFF,iBTgIE,CS9HA,iBACA,4BAKJ,gBVikCoC,kBU/jClC,uJCtCA,iBADA,iBACA,CAFA,iBACA,CAFA,kBACA,CCAA,UDGA,yBEmDE,+CDzCE,eZ+LiB,0BatJnB,wEDzCE,eZ+LiB,0BatJnB,iGDzCE,eZ+LiB,2BatJnB,0HDzCE,gBZ+LiB,kBYlKrB,YDnCA,eACA,CACA,kBADA,kBAEA,wBCuCE,cADF,cAEE,kEAIE,eAFF,eAGE,y6CEnDF,kBADA,kBACA,CAHF,iBACE,WAGA,iBAsBE,YACE,YACA,eACA,0BH4BN,aACE,eACA,0BAFF,YACE,cACA,0BAFF,uBACE,yBACA,0BAFF,YACE,cACA,0BAFF,YACE,cACA,0BAFF,uBACE,yBACA,sBGnBE,aHCJ,CACA,eADA,UAEA,mBGGQ,oBHbR,sBAIA,mBGSQ,qBHbR,uBAIA,mBGSQ,YHbR,cAIA,mBGSQ,qBHbR,uBAIA,mBGSQ,qBHbR,uBAIA,mBGSQ,YHbR,cAIA,mBGSQ,qBHbR,uBAIA,mBGSQ,qBHbR,uBAIA,mBGSQ,YHbR,cAIA,oBGSQ,qBHbR,uBAIA,oBGSQ,qBHbR,uBAIA,oBGSQ,aHbR,eAIA,yBGeI,gCAEA,6BAGE,OADW,qBACX,OADW,qBACX,OADW,qBACX,OADW,qBACX,OADW,qBACX,OADW,qBACX,OADW,qBACX,OADW,qBACX,OADW,qBACX,OADW,sBACX,QADW,sBACX,QADW,sBACX,QADW,sBAQP,uBHhBV,sBGgBU,wBHhBV,sBGgBU,eHhBV,sBGgBU,wBHhBV,sBGgBU,wBHhBV,sBGgBU,eHhBV,sBGgBU,wBHhBV,sBGgBU,wBHhBV,sBGgBU,eHhBV,uBGgBU,wBHhBV,uBGgBU,wBHhBV,yBEKE,mBC3BE,YACE,YACA,eACA,6BH4BN,aACE,eACA,6BAFF,YACE,cACA,6BAFF,uBACE,yBACA,6BAFF,YACE,cACA,6BAFF,YACE,cACA,6BAFF,uBACE,yBACA,yBGnBE,aHCJ,CACA,eADA,UAEA,sBGGQ,oBHbR,sBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,uBGSQ,qBHbR,uBAIA,uBGSQ,qBHbR,uBAIA,uBGSQ,aHbR,eAIA,4BGeI,mCAEA,gCAGE,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,yBACX,QADW,yBACX,QADW,yBACX,QADW,yBAQP,aHhBV,yBGgBU,uBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,yBGgBU,wBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,yBGgBU,wBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,0BGgBU,wBHhBV,0BGgBU,wBHhBV,0BEKE,mBC3BE,YACE,YACA,eACA,6BH4BN,aACE,eACA,6BAFF,YACE,cACA,6BAFF,uBACE,yBACA,6BAFF,YACE,cACA,6BAFF,YACE,cACA,6BAFF,uBACE,yBACA,yBGnBE,aHCJ,CACA,eADA,UAEA,sBGGQ,oBHbR,sBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,uBGSQ,qBHbR,uBAIA,uBGSQ,qBHbR,uBAIA,uBGSQ,aHbR,eAIA,4BGeI,mCAEA,gCAGE,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,yBACX,QADW,yBACX,QADW,yBACX,QADW,yBAQP,aHhBV,yBGgBU,uBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,yBGgBU,wBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,yBGgBU,wBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,0BGgBU,wBHhBV,0BGgBU,wBHhBV,0BEKE,mBC3BE,YACE,YACA,eACA,6BH4BN,aACE,eACA,6BAFF,YACE,cACA,6BAFF,uBACE,yBACA,6BAFF,YACE,cACA,6BAFF,YACE,cACA,6BAFF,uBACE,yBACA,yBGnBE,aHCJ,CACA,eADA,UAEA,sBGGQ,oBHbR,sBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,uBGSQ,qBHbR,uBAIA,uBGSQ,qBHbR,uBAIA,uBGSQ,aHbR,eAIA,4BGeI,mCAEA,gCAGE,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,yBACX,QADW,yBACX,QADW,yBACX,QADW,yBAQP,aHhBV,yBGgBU,uBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,yBGgBU,wBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,yBGgBU,wBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,0BGgBU,wBHhBV,0BGgBU,wBHhBV,2BEKE,mBC3BE,YACE,YACA,eACA,6BH4BN,aACE,eACA,6BAFF,YACE,cACA,6BAFF,uBACE,yBACA,6BAFF,YACE,cACA,6BAFF,YACE,cACA,6BAFF,uBACE,yBACA,yBGnBE,aHCJ,CACA,eADA,UAEA,sBGGQ,oBHbR,sBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,qBHbR,uBAIA,sBGSQ,YHbR,cAIA,uBGSQ,qBHbR,uBAIA,uBGSQ,qBHbR,uBAIA,uBGSQ,aHbR,eAIA,4BGeI,mCAEA,gCAGE,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,wBACX,OADW,yBACX,QADW,yBACX,QADW,yBACX,QADW,yBAQP,aHhBV,yBGgBU,uBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,yBGgBU,wBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,yBGgBU,wBHhBV,yBGgBU,wBHhBV,yBGgBU,eHhBV,0BGgBU,wBHhBV,0BGgBU,wBHhBV,oBXgFO,celIP,kBfkIO,CenIT,UfYW,2CeHP,6BAHF,cfoV4B,mBehV1B,4BAIA,gCADF,qBAEE,+BAGF,4BACE,iDAUF,af8T4B,CelT5B,uFAEA,wBAEE,yEAIA,uBAEE,gJAMJ,QAIE,qDASF,0BfyR4B,wCAnVnB,kCEJT,aFyV4B,qFgB/V1B,wBD8FiC,oICvF/B,oBDuF2E,CC3E1D,6IAMf,wBANe,2FAnBnB,wBD8FiC,4ICvF/B,oBDuF2E,CC3E1D,mJAMf,wBANe,qFAnBnB,wBD8FiC,oICvF/B,oBDuF2E,CC3E1D,6IAMf,wBANe,4EAnBnB,wBD8FiC,wHCvF/B,oBDuF2E,CC3E1D,oIAMf,wBANe,qFAnBnB,wBD8FiC,oICvF/B,oBDuF2E,CC3E1D,6IAMf,wBANe,kFAnBnB,wBD8FiC,gICvF/B,oBDuF2E,CC3E1D,0IAMf,wBANe,+EAnBnB,wBD8FiC,4HCvF/B,oBDuF2E,CC3E1D,uIAMf,wBANe,4EAnBnB,wBD8FiC,wHCvF/B,oBDuF2E,CC3E1D,oIAMf,wBANe,4NAMf,iCANe,kChBlBZ,wBAQA,sBekGP,UfmQ0B,mCAtWnB,wBALA,sBegHP,af/GO,wBAHA,yBe0HX,UflHW,qFesHT,oBf+O4B,uCezO5B,QACE,gEAIA,0BfiO0B,mDA1WnB,sCEKT,UFuW4B,4Ba1S1B,gCEqGI,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,iDAGA,QACE,6BF1GN,gCEqGI,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,iDAGA,QACE,6BF1GN,gCEqGI,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,iDAGA,QACE,8BF1GN,gCEqGI,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,iDAGA,QACE,+BALF,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,8CAGA,QACE,0Bf5KC,2BiBUT,CjBHS,qBAPA,CiBUT,wBACA,sBjBkR4B,aAtRnB,CiBRX,aACE,CAGA,chB0KI,gBD2GwB,CiBvR5B,iCjB2esC,CApNV,eAKA,CA+MU,sBiBzetC,CAQA,qEAXA,UAiBA,uCCJI,yBDdN,eCeQ,uCDMN,wBACE,SACA,gCEfA,qBnBPO,qBA8d6B,CmBpdpC,iCAJF,aACE,CnBudoC,SA3FV,uCiBtW5B,ajBvBS,UiB0BP,sEAQF,wBjBtCS,UiB0CP,gLAQF,uCACE,+CAMF,WACE,0BACA,iDjBtDO,sBiByDT,ajBhES,8DiB4EX,aAEE,WACA,4BAaA,iBhBiEE,iBgBlEF,eACA,CAFA,kCACA,CAFF,+BjBoM8B,+BiB1L5B,iBhB0EI,iBgB3EJ,gCACA,CAFF,6BjBiI8B,+BiBxH5B,iBhBmEI,iBgBpEJ,iCACA,CAFF,8BjB2H8B,oCA1NnB,wBiBoHT,CACA,sCjB+J4B,aApRnB,CiB4GX,aACE,CAGA,chBoDI,gBDgHwB,CiBrK5B,eACA,CAFA,iBACA,CAFA,UASA,uGAIE,eAFF,eAGE,6BjB+F0B,oBiBjF5B,iBhB2BI,CgB7BN,gCjB6VwC,CChUlC,eDsDwB,CA0QU,oBSlepC,6BTuN0B,oBiBxE5B,iBhBmBI,CgBrBN,+BjBsVwC,CCjUlC,eDqDwB,CA4QU,kBSnepC,CQyJA,+GAIJ,WACE,wBAQF,kBjB2UwC,uBiBvUxC,aACE,kBjB4TsC,sBiBnTxC,YACE,eACA,CACA,iBADA,iBAEA,8DAIE,iBAFF,iBAGE,wBAUF,aACA,sBAFF,iBjBmSwC,8BACA,qBiB7RtC,gBjB6RsC,CiB9RxC,iBAGE,kHAGA,ajBvNS,8BiB6NX,eACE,+BAIA,kBACA,CAFF,mBACE,CAEA,oBADA,cjB+QsC,iDACA,ciBzQpC,qBjByQoC,CiB1QpC,YACA,CAFF,eAIE,4BhBrFA,ckBxHF,YACE,CnB4coC,aCrVpC,CkBtHA,iBnB2coC,CmB5cpC,UFyNqC,2BEvMrC,0BACA,sBnBoO0B,UmBrO1B,CAPA,YACA,CAGA,iBlBwHE,CkB9HF,MACA,ClB6HE,eDgHwB,CmBzO1B,gBACA,CAHA,cACA,qBACA,CAPF,iBACE,SACA,CACA,SVrCA,4FUmDA,QAEE,0EAKF,aAEE,mCASE,2QF+KiC,CEtKjC,wDASA,CF6JiC,2BEtKjC,CASA,2DACA,CCtFA,oBHkPiC,6CE5JjC,yCCtFA,oBpB2dgC,0EoB3dhC,uCHkPiC,CElJjC,4BFkJiC,2CExIjC,oJACA,uiBAoCuB,CArCvB,oEAqCuB,0CAKvB,qDACE,sEAGF,4GATuB,mKAtH3B,oBnB4coC,gFmBjcpC,wBACA,CAJA,oBAIA,CACA,6EnB0O0B,gCmBpO1B,CV9CA,qJUqDE,qFCnDE,oBHkPiC,+DE9KjC,aACA,CAFA,aACA,cADA,iBACA,CADA,UAEA,6BF6KiC,0BEtKjC,sBAFF,UFwKmC,CE5KjC,aACA,iBAGF,CAJE,OAIF,gBAHE,iBADA,mCACA,CAFA,0BACA,UAMA,gGAUA,0FnBqYgC,kDoB3dhC,qUDgHA,yDFkIiC,CElIjC,4BFkIiC,4DjByOD,oBmB3XhC,6CFkJiC,2CErHjC,qDAOF,2CF8GmC,iHErGjC,6EAEuB,CFmGU,kCEnGV,sCAMrB,imBFwIN,CEzII,oEFyIJ,4CAGE,qDAIF,2DACE,iIAaA,aACA,mEAIA,aACA,0EAGA,oBAGF,kFAKE,yBADF,oBACE,gFIrVyC,gCFkD7C,CAQE,yJAGA,oBACA,mEV9CA,8EUqDE,8MAOA,qDCxEM,kBCJmC,CF4EzC,6CCxEM,CCJmC,sDFqFvC,0CACA,CADA,UACA,iDACA,iGAEA,sGAGF,cE5FyC,CF4FzC,UE5FyC,2CF8FvC,uHC1FI,kBDmGJ,sEACA,2DnBqYgC,cmBrYhC,aCpGI,apBye4B,CoBze5B,kBDoGJ,UnBqYgC,0CqB7eO,2BF4HvC,qBE5HuC,WFkHvC,8BC9GI,CD8GJ,OC9GI,eCJmC,CFkHvC,qDnB2XgC,0BmB3XhC,UAUA,uUE5HuC,6GFkIvC,2QAWF,CAEE,yDAFF,2BAEE,6DAbA,iEAaA,4GE/IuC,qVFiKhB,kNAMrB,uiBAoBA,CApBA,oEAoBA,kIEzLF,iCAII,4IF4CV,aAEE,6QVpCA,yKUqDE,uLAOA,8MAWE,wBACA,CADA,oBACA,sLExFuC,gCF8FvC,CAUA,gWnBqYgC,gLqB7eO,qDF4HvC,yMACA,0DE7HuC,cF6HvC,aAGF,aEhIyC,CF6HvC,iBAGF,CAHE,UE7HuC,uGFkIvC,8BAOF,CAPE,OAOF,eEzIyC,CFkIvC,yFElIuC,2VF+IvC,iHE/IuC,qUFiKhB,iJAMrB,CEvKqC,iEFuKrC,qRANqB,8YA0BrB,imBGjKN,CHiKM,oEGjKN,kHtBwZ0B,oBsB5Y1B,iLtBoCW,aEhEb,6RqBqBE,6KvB2CW,2LuBvE8K,kNvBuE9K,wBEhEb,CFgEa,oBEhEb,0LqBPuG,gCAqBnG,CvBkDS,wWuBvE8K,oLA+CzL,oBAKI,iCAnDN,yNAD6D,8BA4B3D,wBvB2CW,6CuBlDT,cArBmG,qBvBuE1F,euBvE0F,eAqBnG,CvBkDS,uCuBlDT,kBvBkDS,6HuBvE8K,CAqBvL,wBAOF,kBAPE,qBArBuL,6KA+CzL,gCAKI,CApDqL,SAoDrL,mDvBmBO,0DEhEb,4EqBPuG,4CAcrG,wBAdqG,sBAcrG,UAdqG,+BAqBnG,6CAKJ,CALI,UAKJ,6DvB6Ca,4JuB/BX,wBAxC+I,qBAA0C,CAwCzL,UAxCyL,yKA+CzL,yBAKI,qBALJ,UAKI,2LApDiG,gCAcrG,2BAd2D,wBAA0C,sBAA1C,UAA0C,iCAqBnG,6CAOF,CAPE,UAOF,iEvB2CW,gKuB/BX,wBAxC0L,CAAD,qBAwCzL,UAxCyL,+KA+CzL,wBAKI,sBALJ,UDaF,iMC5DuG,gCAA1C,yBAA0C,6CAqBnG,CArBmG,UAqBnG,uDAOF,qBvB2CW,CuBlDT,UvBkDS,yNuBvEoI,wBAA0C,sBAA1C,UAA0C,yKA+CzL,wBDaF,qBC3DA,CA8CE,UA9CF,2LAWA,gCAZ6D,sBAA0C,yBAqBnG,qBArBmG,UAqBnG,CvBkDS,iFuBlDT,wBAOF,qBvB2CW,CuBlDT,UvBkDS,oJuBvEoI,wBAA0C,sBAwCzL,UAxCyL,gKA+CzL,wBAKI,qBDQN,CCbE,UDaF,kLC5DuG,gCAcrG,yBAdqG,6CAqBnG,CArByD,aAqBzD,uDAOF,qBvB2CW,CuBlDT,avBkDS,4NuBvE8K,oOAoDrL,wBvBmBO,sBuBnBP,avBmBO,2LuBHb,gCAEE,qEvBCW,CuBDX,UvBCW,8BuBKX,iMAMA,CANA,UAMA,iEvBXW,8NuBoBP,wBDzBN,qBtBKa,CuBoBP,UvBpBO,wNuBHb,uBAEE,4DAMA,oFvBLW,wBuBKX,sBvBLW,auBKX,wJvBLW,8NuBeX,wBAKI,sBALJ,aAKI,qLvBpBO,gCuBHb,sBAEE,8CAFF,UAEE,CAMA,iFAHF,wBvBFa,qBuBKX,CANA,UAMA,oJvBLW,8CuBWX,UvBXW,wLuBeX,sBvBfW,UuBeX,kLvBfW,iEuBHb,oBAEE,CAFF,aAEE,+DAGF,qBvBFa,CuBDX,UvBCW,6EuBKX,mHAMA,wBvBXW,CuBKX,avBLW,yNuBeX,sBvBfW,UuBeX,mNvBfW,mEuBDX,qBAFF,aAEE,iEvBCW,sBuBDX,UvBCW,iFuBKX,uHAMA,wBvBXW,CuBWX,avBXW,+NuBeX,qBAKI,CvBpBO,UuBoBP,yNvBpBO,gCuBHb,iCAEE,yEvBCW,wBuBKX,sBAHF,UAGE,gMvBLW,uOuBeX,wBAKI,sBALJ,UAKI,mNvBpBO,gCuBHb,8BAEE,sEvBCW,wBuBKX,sBvBLW,UuBKX,oLvBLW,yBuBWX,avBXW,wLuBeX,6CAKI,CvBpBO,UuBoBP,0MvBpBO,gCuBHb,iCAEE,yEvBCW,wBuBKX,sBvBLW,auBKX,gMvBLW,uOuBoBP,wBDdR,qBtB6M8B,CuBpM1B,avBoM0B,mNA7GY,gCArK/B,gCsBuFP,oBAWJ,CAXI,aAWJ,sCrBqEM,wBQlKF,sBRkKE,UQlKF,2ERkKE,gCQlKF,iFTua0B,yBsBxT5B,atBwT4B,8LwBzb9B,wBNqBQ,qBMlBN,CNiBI,UMjBJ,gNAWF,gCNOQ,mDOpBR,CPoBQ,aOpBR,qCAOA,wBACE,qBCoBE,CDrBJ,aCqBI,yEAIE,gCAhCJ,+EAGA,wBAsDI,CAtDJ,aAsDI,2LD9BJ,wBzBrBS,sByBqBT,azBrBS,6MaqDP,gCYjBE,8BAKA,qBAFF,aAEE,oCAPF,wBAEE,sBZiBF,UYdA,uEZcA,gCYjBE,6EZiBF,wBYjBE,CZiBF,aYjBE,wLCdF,wBACE,qB1BgOwB,CA4fM,UA5fN,0M0BpMxB,gCDYF,CACA,qBAEA,azBirBgC,CyBlrBhC,eACA,CzBirBgC,gD0B7tBhC,aACE,0B1BgOwB,uD0B7NxB,yBAjBJ,6DAEA,mFD8DI,oBCtBA,iBDqBF,gBACE,CCtBA,kBDsBA,kDzB0qB8B,mB0B7tBhC,C1B6tBgC,kCyBhqBhC,oBC7DA,uB1BiO0B,wBADA,kC0B5NxB,wI1B6NwB,UADA,kB0BzMtB,8BA9BN,uCACA,iBACA,sDAiCE,iCACE,oCDuCA,yBADF,iBACE,8LAaF,iBEzGF,6BAEA,qDF4HA,4CAEA,CzBrHS,6ByBmHT,CzB4J4B,qBA/QnB,CyB8GT,UzBiK4B,CyBrK9B,oBACE,mBACA,sBASA,sDvBrHA,2BF0O4B,2BA9OnB,CA8OmB,sBA9OnB,0ByBuJP,qBACA,CARA,azB8F0B,CAjPnB,wByBmJP,ezBnJO,OAiPmB,gBAnPnB,kByBqJP,CzBnJO,+BAFA,CyB8IP,kBzBqG0B,gByBrG1B,QzB5IO,ayB2JP,gCASF,OADF,UACE,iCAKA,0CAEA,kCAGA,OzB1KS,UyB0KT,oCAKA,UADF,OACE,0BzB5KS,wC4BbX,C5BaW,U4BbX,oCAGE,2CACA,kCAEA,OAFA,UAEA,oCAEE,8EAKE,4MAcJ,wBAEA,6BACE,CAJF,6BACA,CAFA,YACA,CADA,WAZI,oBAEF,mBAGE,sBAYF,oGAQA,yGnBNA,8BmBeF,uBnBFE,CAbA,sDmBUF,uCnBXE,sBAcA,oDACA,amBmBJ,8CAEE,8JASE,WAJA,qBAIA,aAJA,wCAIA,8CAUF,8BACA,CALA,uBAGF,CAHE,uCADA,oBACA,0CAKA,mDAqBA,aACA,8CACA,uMASE,mJnBhFA,iCmByFF,CnBzFE,yBmBoFF,anBrFE,CACA,gBADA,qBACA,uCADA,UmB0FF,iEnBvGE,8HmB6HA,uJAEA,CAFA,iCAEA,gCAEE,aACA,6BCrJJ,aACA,CDqJI,aCzJN,CAEE,iBACA,CAFA,eACA,CAFF,oBACE,CAGA,kBACA,uIAEA,mBAIE,CANF,iBAEA,CAIE,qBAEA,gEAEA,msBAKE,4JAaF,4BADF,wBACE,wDAKA,CALA,sBAKA,4IAOA,+KpBhBA,0IAcA,uVoBUA,2JpBxBA,8iBoB6DE,mhCAiDN,gB7BoWwC,8WSnepC,4BRkKE,wBQlKF,wDoBgJJ,CpBhJI,YoBgJJ,yJ7BkVwC,sL6B/TtC,4yBAWF,0EpB7JI,+iBqBtBF,gBACA,kDACA,gDAGF,8B9B0fwC,kB8BrfxC,CAQE,wB9BxBS,yBAmPmB,sB8B7N5B,c9B+esC,a8BlftC,c9BqfsC,gB8BlftC,iBAJA,eACA,CAHF,sBAEE,CAIA,oC9B6N4B,kGAgJA,8GA2FU,+VAxd7B,0K8BgET,gCAEA,gUA2BE,oBADA,iBACA,iBADA,oBACA,qFrBxFA,orBqBsIF,4B9B2Z8C,CArBA,yBAqBA,kbAIA,2B8B5X5C,C9B4X4C,wB8B5X5C,4B9B/KO,gCA2iBqC,oB8B1X1C,a9B2X0C,sCA5iBrC,C8BgLL,iBACA,U9B0X0C,0GkBniB1C,eY+KA,OZ/KA,UY+KA,kBZ/KA,WY+KA,UZ/KA,uEACE,wBYmLJ,CZnLI,+BYmLJ,qEAEE,mH9BoV0C,oB8BlUhD,qFAIE,wB9B+D4B,qBAKA,CA+MU,UA/MV,kI8B7D5B,6JAQE,0DAQA,e9BzOO,CAwkByB,iB8B/VhC,C9BzOO,kBAPA,yC8B+PP,qBAGF,yB9B5PS,CAsXmB,mBAtXnB,gF8ByPP,WAJF,aAEE,Y9B+H0B,CA5XnB,Y8B2PT,C9B3PS,6B8B6PP,UAkBA,C9BzQO,uC8BwQP,gCACA,0D9B8NoC,oBAxGV,uF8B1G9B,4NAkBE,CAGF,6FAOE,yBAFA,oBAEA,6F9B4E4B,0KAjYnB,C8ByUP,sM9BiKoC,0B8BrJtC,uD9BhVS,iBAPA,oF8BiWT,2L9B/VS,C8B4WP,6FAcF,0BACA,+CACA,wDAOE,oBAJA,cAIA,mBAJA,aAIA,uD9BmOyC,wB8BjOzC,qB9BiOyC,wB8BlOzC,0B9BkOyC,sB8BlOzC,CACA,iIAOF,CARE,sBAQF,uCAGE,sDrBtYA,sPqB4YA,qDrB5YA,wCT+lByC,iOALA,yBS1lBzC,sBT+lByC,ckB7lBvC,qBACE,cY2YJ,iBAXF,iCZhYM,CY2YJ,e9BiNyC,CkB5lBrC,uClB4lBqC,sBkB7lBvC,UTFF,4IqBsaA,qBZpaE,CYoaF,aZpaE,qFACE,qBYqaJ,CZraI,gCYqaJ,oC9BuLyC,wBAfT,CAeS,aAfT,uC8BhKhC,Y9BkKgC,0C8B/JhC,WrBnbA,wDT0lByC,iBS1lBzC,CTulByC,gC8B5JzC,C9BrE0B,wCAoOe,CApOf,kBStX1B,oGqBkcA,CrBlcA,iFqBmcA,eZjcE,uDYgcF,iCACA,CrBncA,4BT+lByC,CkB7lBvC,8BACE,SYkcJ,S9B0JyC,C8B1JzC,gBAbF,S9BuK2C,wDAfT,oBACA,C8BpIhC,gC9BqIgC,sHA1lBzB,wBSQP,iEqB2dA,gB9BneO,qE8ByeP,yB9BveO,oD8BofL,8CAGF,C9BvfO,gB8B4eL,kCADF,OAIA,e9B/eO,C8B2eP,SAYA,mE9BvfO,8B8B4eL,sBAGF,C9B/eO,yB8B2eP,C9B3eO,KkBQL,CY+eF,oCAMJ,wBAGE,oDZxfI,ClBRK,S8B6fX,iB9B7fW,yC8B6fX,C9B7fW,SkBQL,0BYqfN,uBZpfQ,gBafN,CbcI,wBYqfN,CZrfM,kCadJ,gCAEA,+DAMA,+CACA,kDAIE,+CAMA,2CASJ,+CAGE,4CAEE,wDAcF,uB/BvCS,gBAPA,CSqBP,kCPZF,mBOYE,+BPZF,8G6BgCI,uGAKJ,CtB1BE,UTpBO,uCA0rByB,+C+BnoBhC,uBtBnCA,wEATA,iFTwO0B,2C+B/J5B,mBAEE,C/BtFO,WAmPmB,gBAnPnB,a+BuET,UAeE,CACA,2CCxEF,eACA,CDuEE,wBAOA,SACA,mBACA,CATA,YASA,2GAcA,uGC/FF,CDwEE,UCvEF,kMAIA,4CAIE,wBAqBF,mBhCkqBkC,oBgCxrBhC,WACA,gBADA,aADA,UhCyrBgC,qCgCpoBlC,eACE,CAzBF,iC9B1CA,mB8B6CE,C/BuHE,W+B3HJ,CACA,qCADA,aAIE,0GAcF,uGAOA,C/BkGI,U+BjGF,uCAUJ,oChC0lBoC,gFgCzkBlC,wBAGA,qCAQA,wBACA,mBvBxGE,oBRkKE,W+B5DJ,eACA,C/B2DI,a+B9DJ,UvBpGE,CuB4GA,kF9B9GF,wB8B8GE,mBAWF,CAXE,yCAQF,iBAGA,yDAIF,wBhCglBoC,CgC9kBlC,iEnBtEE,oOmBkFI,iGAFJ,sGAwBM,uIhC+hB0B,wRgClhB5B,CACE,eADF,mBACE,qDAeA,gCAGF,sBAIE,6DAIA,CAXA,kBAWA,2EnBhJN,2NmBoFM,qBnBjGN,kCmB6FA,CAGM,aAHN,qCAqBI,kDAGE,CAJF,eAIE,qDAEA,8EhC6hB0B,yBgCzhB1B,UhCyhB0B,gQgClhB5B,iCACE,iCAmBA,kBAGA,CARF,iBAQE,0NAPA,kBAGF,CAHE,4BAGF,6BnBxIJ,+CmBoFM,iBnBjGN,oBmB6FA,CAIM,kBAFF,uBAEE,CnBpFN,oBmBkFI,CAFJ,kBAoBI,+DACA,oBAGE,0DAEA,CACE,gCADF,cACE,kChC4hBwB,egCzhB1B,ehCyhB0B,4PgCjhB1B,wBAeA,4CAGF,CAlBE,gChCihB0B,qBgC/f5B,mEAIE,oBAGF,iCnB/IJ,8CmBgJM,oBnBhJN,2YmBwGM,wDAEA,6BACE,+CAGF,0ChCyhB0B,ybgC3f1B,gBAGF,iDA/DJ,gBAoBI,+CACA,+XAMI,wDhC4hBwB,sQgCjhB1B,mBADF,mBACE,mQAwCR,gBhCigBkC,oMExtBlC,YFwtBkC,+RAFA,wDACA,sHgChf9B,kBhCkf8B,ubgC7ehC,iDhC4egC,+DgCpelC,sBhCkekC,gBAKA,wFgClelC,kQhC+dkC,iMExtBlC,yD8B2QA,iBhCpRS,6VgCoSL,iEhCub8B,2LA3tBzB,+CgCiTT,iPAWE,chC5TO,CAwtByB,eAxtBzB,+GiCHX,iBACE,iDAKA,mBAFA,mBjCDS,iPiCgBP,gBAEA,8CACE,gBxBCF,4CACA,sCwBEA,2CACE,YxBUF,CACA,qQwBiBJ,eACE,gG/BhDA,e+B0DE,uNAiBF,eAEA,kHAMA,ejCwuBkC,ibAMA,eS3zBhC,oFwBuHF,sBAGF,CAHE,eAGF,8FxBhHI,wQwBsIA,8EjC6qBgC,gBiCppBhC,2QAgBI,exBzKJ,CACA,8HwB2KM,yDAGE,wHAKA,uExBrKR,kOwB+KQ,mDAKA,sBAcV,CAjBQ,eAiBR,8CpBvLE,8QJnBA,sCACA,ewB0OA,CxBxPA,iIwB8PE,UC1RN,kBAME,qBzBYE,wByBZF,qBlCGS,CSSP,iCyBLF,qBlCyhCkC,CkCpiClC,YACA,sBlCqiCkC,YkCliClC,CALA,iBlCqiCkC,kCkCrhC9B,ClCqhC8B,ckCrhC9B,8BAGA,sBlCkhC8B,kBkClhC9B,0CAWF,oFAIA,CALF,kBAKE,yC5B9BF,4C6BCF,CnCOW,6CMRT,CNQS,qBmCPX,qFnCwxBoC,YA/mBM,uBAxK/B,4BmCQT,wCAGE,oBnC+JsC,2BAxK/B,eACA,CmCUP,mBnCVO,kCmCgBP,enC4wBgC,iDA5ZN,kCmCxW1B,mBACE,yB1BcF,mEAfA,CAcA,eACA,CADA,sBAdA,qCACA,uDT5BO,yBAmPmB,gEmCpM1B,CnCoM0B,sBmCpM1B,oCnC/CO,uDoCJT,8BpCsO4B,qCoC9NxB,4DpC8NwB,qBoCrO1B,qB3B6CA,8BAfA,gCACA,C2BnBE,e3BkBF,iBAeA,iB2BjCE,c3BmBF,2ETuM0B,uEoC/NxB,yC3BqCF,2CACA,kDAdA,4C4B7BF,CDUI,6CCTJ,6BpC6JE,kBoC1JF,yBACA,sBACA,YACA,mB5BKE,8H4BHF,gDnBKI,yBACE,sDhBLN,8BmCGI,wBAMF,oCAOF,cAFF,aAEE,+C5BdE,4B4BgCF,CrCs3BkC,yBqCt3BlC,wHC5CI,yBACA,2HAMA,4BAZJ,gDtC2Ea,2BsCtET,CtCsES,wBsCtET,0HAMA,wBACA,6HtC+DS,2BsCtET,iCACA,6CAGF,yBAEE,iCACA,mBDqCJ,gCCjDA,oBtC2Ea,uDsCtET,6BACA,+DAKA,gBACA,2BDqCJ,CCtCI,4BDsCJ,iDrC0Ba,4FsCrET,0DAMA,wBAZJ,qBtC2Ea,CsCrET,YAGF,eAEE,CACA,gBADA,kBACA,CADA,mBtCgES,gEE5Db,qDoCTI,aAGF,YAEE,CALA,8BAKA,2DDsCJ,yBCjDA,CtC2Ea,oBsC3Eb,CpCeA,mCoCTI,qCAKA,qBALA,aAGF,eAEE,CALA,cAKA,uBtCgES,qBsCtET,yBACA,CtCqES,cqC1Bb,aCjDA,CtC2Ea,kCsC3Eb,oBtC2Ea,CsC/DT,iBANA,6BAKA,6CACA,CANA,kCAKA,CALA,SAMA,6BtC6yB8B,gCAjzBzB,CuCRT,UADF,SvCSW,8CuCDP,gCAKF,CAbF,6BAQI,C1BoDA,a0B/CF,6CCRA,iCxC09BkC,CwC39BpC,8BxC29BoC,yCS78BhC,wB+BHF,qBAIF,C/BDI,oB+BCJ,2CAUE,qBAGA,qBAEE,CxC8P0B,awCpQ9B,CACE,YADF,mBAOI,sCAGA,iBAUF,gBACqH,CAZnH,qBAYmH,6DC5CrH,+BACE,CD2CmE,4BC3CnE,4DD2CmH,gCAAhD,CADrE,6BACqE,sCC3CnE,iCAGF,CAJA,oBAIA,6DDwCyB,+BAA4C,CAAgD,4BAAhD,4DCvCnE,gCDuCmH,CC3CnH,6BD2CmH,mBCvCnH,oBDuCmH,CAA5F,qBAA4C,aC5CrE,8BACE,CD2CmE,mBC3CnE,kBD2CmH,6HC3CnH,CAIA,uBAJA,yDAIA,kBDsCF,eACqH,oDAAhD,oBC5CrE,yBACE,oCAGF,iBACE,iCDuCuB,mBAA4C,CAA5C,kBAA4F,kBAAhD,2BC3CnE,yBADF,UACE,mED2CmH,wBAA5F,CAA4F,UAA5F,mEC3CvB,gCAIA,CAJA,SAIA,6BCPA,wBACA,CADA,UACA,uEAOF,wBACA,C1C+9BkC,U0C/9BlC,uEAOF,gCAEE,CjCHE,SiCGF,2B1CdS,wB0CkBT,CAFA,UAEA,mEAGA,wBxBRI,CwBQJ,UxBRI,mEwBWN,iCxBVQ,SwBUR,gJCYE,CDZF,UCYE,6DDNA,gCACE,CADF,SACE,2BAGE,yBAHF,aAGE,mEEvCJ,wBAIA,CALA,aAKA,mECGA,gCpCSE,CoCZF,SpCYE,0BoCGF,wB7CPS,C6CMX,U7CNW,iE6CST,wB3CPA,C2COA,UAIE,iE7CnBO,gC6CyBT,C7CzBS,SAQA,yBAPA,wB6CmCX,C7CnCW,a6CmCX,+D7CrCW,yB6CwCT,aAIA,+DpCxBE,gCACA,CoCyBF,SpCzBE,wBoC6BF,yBpC7BE,UoC6BF,6DpCfE,gGTnCO,gC6C8DT,CALE,SAKF,uB7CqL4B,gEAnPnB,iBAmPmB,yB6C9K5B,sBACE,+CAGE,e7C4JwB,C6C5JxB,eAHF,e7C+J0B,mB6C5IxB,uBAGE,qBAHF,mBADF,sBACE,C7C4IwB,iB6CzItB,2BpC1BJ,aAZA,sEoC2CI,wDAME,cpCrCN,sBoCqCM,CpCrCN,yCoCqCM,mDAGF,qB7C2HsB,C6C9HpB,a7C8HoB,8B6CzHpB,+DAEA,aACE,6BhC1DR,6CgCmCA,C7C6I0B,a6C7I1B,gCACE,iEAGE,apC1BJ,2BAZA,yFoC2CI,wBpC3CJ,uCAYA,qCoCqCM,8CADF,aACE,2BAGF,wB7C2HsB,oC6CzHpB,wCAEA,wBACE,qB7CsHkB,C6CzHpB,a7CyHoB,8BahL1B,yBgCmCA,sCACE,uCAGE,6CpC1BJ,CoCuBE,apCvBF,6BAZA,8DoC2CI,apC3CJ,yBAYA,8CAZA,aAYA,4BoCqCM,6DAGF,qCAEE,8C7CyHoB,a6CzHpB,2BAEA,wBACE,oC7CsHkB,aahL1B,CgCoCE,qBpCnCF,8CoCsCI,apCtCJ,iBoCsCI,YpC1BJ,aAZA,CoCsCI,epCtCJ,0BoCiDM,yBpCrCN,WoC+BI,YpC3CJ,sBAYA,yDoCoCI,CACE,0BADF,kBACE,uC7C8HoB,yB6CzHpB,iKAnBJ,0BAGE,mCpC1BJ,iDAZA,uCoC2CI,kCpC3CJ,cAYA,0CoCoCI,CpCpCJ,YoCoCI,wBACE,gCAKA,qBALA,kCAGF,C7C2HsB,e6CzHpB,CAFF,cAEE,iDAEA,mBACE,CAHF,UAGE,mFAmBR,yBpCvHA,kCoCsHF,CpCtHE,SoCuHA,2CAGE,yBADF,aACE,6BAYqC,wDAA+B,aAA/B,wBAA+B,iBAA/B,yC3CxIzC,8B2CwIwE,gCC9IlE,wC9CHG,iC6CiJ+D,CC9IlE,kCD8IkE,2EAA/B,mH3CxIzC,qB2CwIwE,CAA/B,oBAA+B,yDC9IlE,kFD8IkE,oBCrJxE,CDqJwE,eCrJxE,mCDqJyC,4I3CxIzC,+D4CNM,2B9CHG,C8CGH,8B9CHG,2D6CiJ+D,YCrJxE,qEDqJyC,oHC9InC,sBD8IkE,gBC9IlE,8D9CHG,kB6CiJ+D,mGAA/B,4F3CxIzC,2B2CwIwE,CAA/B,8BAA+B,8DC9IlE,YAGF,wEAVJ,mBDqJwE,oGAA/B,qGAA+B,kBC9IlE,mE9CHG,gC6CiJ+D,4FAA/B,wH3CxIzC,Y2CwIwE,wEC3IpE,mB9CNK,C8CGH,oB9CHG,+E6CiJ+D,qBAA/B,CAA+B,gBAA/B,oJC9InC,4HCTN,2B9CmLI,C4C5BoE,8B7CwI5C,8D+CzR5B,oFAKE,uHAiBF,qBACA,CAFF,gBAEE,2BACA,qCAOA,kBCtCF,mE/CoLM,gCD8tB8B,0BgD14BlC,kEvCUE,4BTo4BgC,8BgDx4BlC,8DAKE,oFAaJ,mBACE,CALE,oBAKF,+EhDw3BkC,qBgDn3BlC,ChDzBS,gBgDyBT,8CACA,+CvCZE,8ETm3BgC,qBiDx4BpC,qCAIE,wBAEE,CAJF,aAIE,mIAuBJ,wBACE,CARA,aAQA,mEAOA,6CACE,CAJF,UAIE,uCjDu6BgC,wBkB/7B9B,ClB+7B8B,akB/7B9B,uIlBk8B8B,yBiDl6BlC,ajDk6BkC,qEiD35BlC,6CAEA,CAFA,UAEA,qCAEE,yKASA,wBAIJ,CAJI,aAIJ,mEAGE,wBAGA,qBACE,CAJF,UAIE,kCACA,wBAEA,CAFA,aAEA,6HAOA,sGAGE,6CAIA,CAJA,UAIA,qCAOJ,wBACA,CAFF,aAEE,mIxC1FE,wBwCsGF,CAJA,aAIA,mEAUA,wBjDjHS,sBiDgHT,UjDhHS,oCiDsHT,wBjD8zBkC,CiD/zBlC,ajD+zBkC,iIiDpzBlC,wBxCtHE,CwCsHF,axCtHE,kEwCyHF,wBjDwzBkC,qBiDrzBhC,CxC3HA,UwC2HA,mCAMF,wBjDuI4B,CiDxI9B,ajDwI8B,+HiDrH5B,wBAEA,CAFA,aAEA,iExCxIE,6CACA,CwCwIF,UxCxIE,kCwC+IA,yBADF,aAMF,6HjDkxBoC,wBiDrwBhC,CAFF,aAEE,gEAIA,6CAEA,CAFA,UAEA,mBAKF,UACE,CANA,WACE,iCAIJ,eACE,4DAEA,UACE,kIpC9JF,oCbm5BgC,wBan5BhC,Ubm5BgC,SiDjuBlC,6BjDguBkC,mBkD78BpC,mBlDg2BoC,4IkD/1BlC,gBAEA,ClD61BkC,kBkD71BlC,elD61BkC,8CAlkBN,oBAKA,2BmD9R5B,SACA,wBACA,aACA,kCACA,YACA,0BAEA,kBACA,CDFA,2BlDk1BkC,CC1qB9B,0BiDxKJ,ClDk1BkC,iCkD70BhC,0ClDm1BgC,2CkD70B9B,CCRJ,alDqKI,CkDxKJ,YACA,CACA,qBDSI,wBACA,cACA,wBACA,+EAKN,mBACE,wBAEA,CAFA,OAGE,UADF,eACE,CAHF,4CAGE,0DAGE,CAHF,4BAGE,sClDrBK,4BkDsBL,iClDtBK,uCkD6BT,yGAGE,8ClDkzBgC,mGkD7yB9B,oDlDrCK,kJkD6CT,8DAGE,8GAGE,0CAON,UACE,ClD3DS,qFkD2DT,iFlDwxBkC,WADA,CkDrxBlC,sBlDqxBkC,2JkD9wB9B,YlDpEK,2BSCP,2B2ClBJ,CF+GE,qBlD9FS,CoDjBX,sBAGE,oBAEA,CpDq1BkC,kCAn1BzB,CoDFT,UF0GA,oBAJF,iBlD+uBoC,CAn1BzB,UoDFT,4BpD+2BkC,sMmDj3BlC,sBnDiS4B,CmD5R5B,+BACA,yCAEA,0CAEA,CAVA,anDiS4B,6BmD7R5B,aAOA,iClDsKI,6BD7KK,CmDQT,YnDRS,yBoDOT,gBpDPS,eoDOT,wB3CIE,a2CCF,aACE,C3CFA,iB2CEA,0BAIA,mBAME,2CAEA,CAJA,4CAEA,CANF,4BAIE,CpDw2B8B,YACA,eoD72BhC,wCAQE,8EpDq2B8B,6FoD71BlC,yBACE,sGAGE,oDACA,+BpD21B8B,2GA5pBN,2BArOnB,mFoDkDX,0BpD40BoC,oFoDz0BlC,qBACE,gBpDw0BgC,EADA,oBACA,qBoDr0BhC,sMpDw0BgC,CAHA,kBAGA,iCoDh0BhC,CpDjEO,sBA83ByB,gBoD7zBhC,epDoK0B,CoD5K1B,SpDq0BgC,SoDlzBlC,CAnBE,kBpD4K0B,gCoDlKxB,qBpDnEK,sCA83ByB,mBA93BzB,iBoDyEX,oBpDqzBoC,CoDr0BhC,YAmBF,0BACE,iIAIE,kBpDgzB8B,oBoDhzB9B,WADA,iBpDizB8B,yFoD5yBhC,wFpDrFO,8GoDgGP,qBpD6xBgC,CoD/xBhC,0BAEA,CAHF,KpDgyBkC,8EoDxxBhC,2GpDyxBgC,yIoD9wBhC,gJAIE,epD6wB8B,+MoD9uBlC,wBnD0BI,CmD3BJ,0BACA,CAFF,QnD4BM,4EmDtBJ,e3CnIE,0F2C2IJ,aAJI,mBAKF,wGClJF,sBAEE,CALA,gCAGF,CAJA,MAME,2BCnBE,qBDwBJ,qBACE,CC3BE,UACA,CDqBF,oCCtBE,CACA,iBD0BF,qBAiBA,oBAGF,CAEE,2BASA,CAXF,qBAEE,CASA,sBACE,oBACA,CA7BF,sMnCZM,CmCyBN,kBnCzBM,iCmCiBR,CALE,OAWF,qBAEE,iBARF,eAGE,CAPA,eADA,CAFA,iBACA,CASA,0FAGF,CAZE,KACA,CAaA,yDAbA,YA8BE,sKAOA,iDAJF,aAIE,CAPA,iBAOA,0EAMA,2GnCxDE,+HmCoEJ,0BAGA,CnCtEM,0BmCiER,CnCjEQ,QmCsEN,oGrD29BmC,sBqDl9BnC,0BrDk9BmC,CqDn9BnC,UrDm9BmC,CqD/8BnC,6EnCnFI,6GACE,wKmC6FN,4BAMA,CrD+7BmC,gCqDr8BnC,CrDq8BmC,MqD/7BnC,wGAYA,wBrDg8BmC,gCqDh8BnC,CrDg8BmC,QqDh8BnC,gFAGA,8GAGA,sBASF,4GAYE,6BAEA,CrDo5BmC,0BqDt5BnC,CrDs5BmC,KqDp5BnC,0GrD1JS,wBqDoKP,CAFA,0BrDlKO,CqDiKP,OAGA,8HnCtJI,+BmC+JJ,CnC/JI,WADF,uBmC6IJ,kBnC5IM,CmC2JJ,iBnC5JE,iBmCgKF,4EAaF,kBACA,0FE7LA,YAGF,eAHE,oCAGF,wGAQE,4BAHA,gCAGA,CAHA,OAIA,sGAmBE,uBALF,gCAKE,CALF,SAKE,4BvD6iCsB,wBuDpiCxB,gCAGA,yCACA,0CvDmiCwB,CALA,cAEA,CAFA,gBuDtiCxB,oBvD2iCwB,8CuD1hCxB,uCACE,CADF,oBACE,sBAEE,qDC3DN,8CACA,eACA,CADA,4BACA,kCACA,sBADA,aACA,2BACA,kCACA,4BADA,2CADA,iBACA,CACA,oCCFE,CDCF,UCAI,iLAKE,cANJ,+FACE,0HAKE,2BANJ,0CACE,uWAKE,mCANJ,CAMI,SANJ,uCACE,2GvDUF,qFuDVE,mBvDUF,wBuDLI,CALF,wDAKE,WALF,UADF,iBACE,kBvDUF,CuDVE,MAKE,6BALF,mBAKE,uCALF,gQvDUF,qBuDVE,oBvDUF,mCuDXA,yCACE,sFvDUF,kCwDJF,CDNI,oBvDUF,uBwDJF,wCACE,gNCLF,wCACA,iNAKA,iCACA,SACA,oCADA,OAKI,gBADF,eACE,CADF,iBAHF,cAGE,CAJF,oCAKI,oCADF,4BACE,sBADF,8BACE,CADF,8CACE,CADF,cACE,cADF,YACE,eADF,iBACE,YADF,mBACE,2BADF,qFACE,gBAIJ,yCACE,uCAWF,YAIA,WAJA,SACE,mBAGF,CAHE,iBALF,iBACE,UAGF,CAIA,iBACE,CALF,UAKE,CACA,2BASA,6CACA,CAFF,oCACE,CADF,+BALA,qBACE,kCACA,CADA,UAMA,+BAIA,kBADF,sBACE,CAIF,yBAYA,2CACE,CALF,6BACE,kBAGF,CAXE,oBAGF,YACE,CAOF,UAPE,sBAGF,CAJA,UL/DE,6BAGE,YADA,UACA,uCMOE,6a/CiDF,wB+CjDE,wc/CiDF,kC+CjDE,g7CAUN,4BAEI,weCrBJ,6BAGE,yBAEA,kDAGE,4BACA,6KAGF,8BAME,CACA,2BAEA,8BAEA,2BASA,8BACE,oKADF,wBACE,6BCzBF,mDACA,gEACA,yCACA,2BAEA,2CACA,CAHA,wCAGA,4BACA,0CACA,CAFA,2CAEA,0BACA,0CACA,CAFA,uCAEA,qDACA,4BACA,kFAEA,gDACA,mFACA,oEACA,0DACA,wFAEA,oDACA,sDACA,qEACA,sDACA,qEAEA,qFACA,+CACA,2EACA,wDACA,yEACA,2DAEA,gDACA,uEACA,6DACA,+CACA,2EACA,wDjDYA,4BiDlDA,6CACA,2DACA,sEACA,gFAEA,+BACA,sEACA,mDACA,wDACA,mDACA,oDACA,wDACA,qEAEA,uDACA,6EACA,2EACA,oFACA,2EAEA,4CACA,2EACA,0DACA,gFACA,kDAEA,0FACA,sDACA,uDACA,4DACA,wCADA,iBACA,gDACA,2NAKA,qCADA,iBACA,4DACA,mEACA,kBjDYA,0CiDlDA,yDACA,kEACA,wDACA,kEAEA,wEACA,+CACA,mDACA,+DACA,8CACA,8CACA,8CACA,6EAEA,0DACA,qEACA,sEACA,4GACA,0EAEA,+BACA,2FACA,4DACA,gEACA,8DAEA,mEACA,+DACA,gEACA,wEACA,sEACA,kEAEA,sDACA,6DACA,wFACA,4DACA,6DACA,qDjDYA,wBiDlDA,wDACA,gEACA,wEACA,iEAEA,oDACA,4DACA,0DACA,mDACA,iDACA,mDACA,qDACA,6DAEA,wEACA,yEACA,wEACA,8EACA,wEAEA,gEACA,iEACA,iEACA,kEACA,iEAEA,oEACA,qEACA,oEACA,0EACA,0EACA,+DAEA,0DACA,8DACA,+DACA,+DACA,gEACA,sDjDYA,wBiDlDA,wDACA,gEACA,wEACA,iEAEA,oDACA,4DACA,0DACA,mDACA,iDACA,mDACA,qDACA,6DAEA,wEACA,yEACA,wEACA,8EACA,wEAEA,gEACA,iEACA,iEACA,kEACA,iEAEA,oEACA,qEACA,oEACA,0EACA,0EACA,+DAEA,0DACA,8DACA,+DACA,+DACA,gEACA,sDC1CA,oDACA,4BACA,gEAFA,wEACA,uCACA,kDlDoDA,4BkDtDA,4DACA,gCACA,iDlDoDA,4BkDtDA,iDACA,mDACA,wBlDoDA,6BkDtDA,6DACA,oCACA,sECLF,mWCCA,2UAQA,qCjEkqBkC,8BiE3pBlC,sCjE2pBkC,0EiErpBpC,0EjEopBoC,+BkEtqBlC,gCAEA,yBAEA,iCAEA,+BACA,4DAUA,kCAIE,2BAEA,oCC5BJ,4FACA,mDACA,uFACA,iCCCI,uZAIJ,mDACA,uBAIA,qDACA,0EAEA,oCACA,kCCTQ,uCACA,gCAEE,wCAEF,uCAIA,uCAEE,sCAEF,kCAbA,gEACA,8BAEE,mCAEF,4BAEE,qCAEF,8BAEE,oCAEF,6BAbA,sEACA,kCAEE,gCAEF,qCAEE,8BAEF,CAEE,qCAEF,qCAEE,qCAfF,oCACA,sCAEE,+BAEF,gCAEE,yBAEF,iCAEE,+BAEF,+BAbA,+DACA,2BAEE,oCAEF,6BAEE,mCAEF,4BAEE,6CAEF,yBAEE,qBAfF,4CACA,yBAEE,8CAEF,4BAEE,qBAEF,2BAEE,8CAEF,0BAbA,qEACA,2BAEE,oBAEF,0BAEE,8CAEF,4BAEE,qBAEF,2BAEE,oBAfF,qDACA,gDAEE,qBAEF,2BAEE,kDAEF,iCAEE,0BAEF,8BAbA,6DACA,8BAEE,kCAEF,2BAEE,kDAEF,6BAEE,yBAEF,6BAEE,yBAfF,0DACA,+BAEE,2BAEF,4BAEE,wBAEF,6BAEE,iCAEF,0BAEE,uBAfF,0EAGE,gBAFF,cAEE,qBAEF,2DAIA,8CAEE,gBAEF,yCAZA,kBAEE,SAEF,CALA,sCACA,CADA,UAeE,iBAfF,CAGE,mBAHF,SAKA,0EAQA,UAFE,4BAEF,CAJA,gBAIA,kBAEE,CANF,UAME,uBAQF,uDACA,8DAIA,wEAIA,kDAEE,kBAEF,qCAEE,mBAfF,wDACA,oBAEE,wCAEF,sCAEE,sCAEF,kBAEE,uCAEF,yCAEE,qBAfF,4CACA,6CAEE,wBAEF,yBAEE,kDAEF,oBAEE,yCAEF,sBAEE,iBAfF,qDACA,yDAEE,wBAEF,mCAEE,yBAEF,mCAEE,uBAEF,wCAEE,mCAfF,4BACA,kCAEE,6BAEF,mCAEE,8BAEF,mCAEE,6CAEF,sBAEE,mCAMN,6DACA,4BAEE,mCAEF,6BAEE,mCAEF,2BAEE,sCAEF,mCAEE,yBA3DE,8DACA,mCAEE,4BAEF,mCAEE,0BAEF,wCAEE,mCAEF,2BAEE,mCAfF,gEAGE,iEAEF,4BAEE,iBAEF,wDAEE,yBAEF,mCAEE,2BAfF,+DACA,CAEE,4DAEF,iBAEE,sDAEF,uBAEE,mCAEF,yBAEE,mCAfF,6DACA,wBAEE,yCAEF,mCAEE,4BAEF,mCAEE,8BAEF,mCAbA,kEACA,6BAEE,wCAEF,mCAEE,8DAIA,gEAEF,8BAbA,+DACA,uCAEE,mCAEF,0BAEE,mCAEF,4BAEE,mCAEF,6BAEE,mCAfF,4CACA,wBAEE,mCAEF,4BAEE,iEAIA,kEAIA,mCAfF,oEACA,mCAEE,0BAEF,mCAEE,4BAEF,mCAEE,gEAIA,2BAfF,+EACA,4BAEE,qCAEF,8BAEE,qCAEF,+BAEE,qCAEF,6BAbA,8EACA,2BAEE,qCAEF,6BAEE,qCAEF,8BAEE,qCAEF,4BAEE,kBAfF,2DACA,0BAEE,qCAEF,iEAEE,6BAEF,qCAEE,2BAEF,kBAEE,wBAfF,iEACA,qCAEE,8BAEF,qCAEE,+BAEF,qCAEE,6BAEF,wCAEE,qCAQF,+DAGE,iEAEF,6BAEE,qCAEF,2BAEE,yCAEF,yCAEE,yBAfF,oEACA,yCAEE,4BAEF,yCAEE,0BAEF,yBAEE,qCAEF,yCAEE,sBAfF,iEACA,yCAEE,yBAEF,yCAEE,uBAEF,2CAEE,yCAEF,2BAbA,sEACA,yCAEE,8BAEF,yCAEE,6BAEF,yCAEE,yCAEF,0BAEE,yCAfF,qEAGE,sEAIA,+CAEF,8DAEE,yBAEF,yCAQJ,oEACA,4BAEE,yCAEF,0BAEE,2CAEF,yCAEE,oEAIA,6BxDTF,yCwDlDI,8BACA,yCAEE,4BAEF,oBAEE,8DAIA,kEAIA,2BAfF,qEACA,yCAEE,0BAEF,oBAEE,4DAEF,uBAEE,yCAEF,yBAEE,CAfF,kEACA,yCAEE,wBAEF,4CAEE,yCAEF,4BAEE,yCAEF,8BAEE,CAfF,uEACA,yCAEE,6BAEF,oBAEE,gEAIA,oEAIA,6BAfF,uEACA,yCAEE,4BAEF,oBAEE,+DAIA,mEAEF,4BAbA,sEACA,yCAEE,2BAEF,oBAEE,iEAIA,qEAIA,8BAfF,wEAGE,yCAEF,6BAEE,0CAEF,yCAEE,0BAEF,yCAbA,qEACA,6BAEE,yCAEF,2BAEE,6CAEF,2CAEE,4BAEF,2CAbA,yEACA,+BAEE,2CAEF,6BAEE,qBAEF,uBAEE,2CAEF,2BAEE,2CAfF,wEAGE,8BAEF,2CAEE,4BAEF,2CAEE,2CAEF,0BAEE,CAfF,sEACA,2CAEE,6BAEF,2CAEE,2BAEF,6CAEE,2CAEF,4BAbA,yEACA,2CAEE,+BAEF,2CAEE,6BAEF,qBAEE,iEAIA,0BAQF,uEACA,2CAEE,6BAEF,2CAEE,2BAEF,uBAEE,oEAIA,yBAfF,0EACA,+CAEE,4BAEF,+CAEE,0BAEF,0BAEE,qCAEF,yCAEE,sBAfF,iEACA,yCAEE,yBAEF,yCAEE,uBAEF,2CAEE,yCAEF,2BAbA,sEACA,yCAEE,8BAEF,yCAEE,6BAEF,yCAEE,yCAEF,0BAEE,yCAfF,qEAGE,sEAIA,+CAEF,8DAEE,yBAEF,yCAQJ,oEACA,4BAEE,yCAEF,0BAEE,2CAEF,yCAEE,oEAIA,6BxDTF,yCwDlDI,8BACA,yCAEE,4BAEF,oBAEE,8DAIA,kEAIA,2BAfF,qEACA,yCAEE,0BAEF,oBAEE,4DAEF,uBAEE,yCAEF,yBAEE,CAfF,kEACA,yCAEE,wBAEF,4CAEE,yCAEF,4BAEE,yCAEF,8BAEE,CAfF,uEACA,yCAEE,6BAEF,oBAEE,gEAIA,oEAIA,6BAfF,uEACA,yCAEE,4BAEF,oBAEE,+DAIA,mEAEF,4BAbA,sEACA,yCAEE,2BAEF,oBAEE,iEAIA,qEAIA,8BAfF,wEAGE,yCAEF,6BAEE,0CAEF,yCAEE,0BAEF,yCAbA,qEACA,6BAEE,yCAEF,2BAEE,6CAEF,2CAEE,4BAEF,2CAbA,yEACA,+BAEE,2CAEF,6BAEE,qBAEF,uBAEE,2CAEF,2BAEE,2CAfF,wEAGE,8BAEF,2CAEE,4BAEF,2CAEE,2CAEF,0BAEE,CAfF,sEACA,2CAEE,6BAEF,2CAEE,2BAEF,6CAEE,2CAEF,4BAbA,yEACA,2CAEE,+BAEF,2CAEE,6BAEF,qBAEE,iEAIA,0BAQF,uEACA,2CAEE,6BAEF,2CAEE,2BAEF,uBAEE,oEAIA,yBAfF,0EACA,+CAEE,4BAEF,+CAEE,0BAEF,0BAEE,qCAEF,yCAEE,sBAfF,iEACA,yCAEE,yBAEF,yCAEE,uBAEF,2CAEE,yCAEF,2BAbA,sEACA,yCAEE,8BAEF,yCAEE,6BAEF,yCAEE,yCAEF,0BAEE,yCAfF,qEAGE,sEAIA,+CAEF,8DAEE,yBAEF,yCAQJ,oEACA,4BAEE,yCAEF,0BAEE,2CAEF,yCAEE,oEAIA,6BxDTF,yCwDlDI,8BACA,yCAEE,4BAEF,oBAEE,8DAIA,kEAIA,2BAfF,qEACA,yCAEE,0BAEF,oBAEE,4DAEF,uBAEE,yCAEF,yBAEE,yCAfF,0BACA,yCAEE,wBAEF,4CAEE,yCAEF,4BAEE,yCAEF,8BAEE,yCAfF,+BACA,yCAEE,6BAEF,oBAEE,gEAEF,2BAEE,yCAIA,6BAfF,uEACA,yCAEE,4BAEF,oBAEE,+DAIA,mEAEF,4BAbA,sEACA,yCAEE,2BAEF,oBAEE,iEAIA,qEAIA,8BAfF,wEAGE,yCAEF,6BAEE,0CAEF,yCAEE,0BAEF,yCAbA,qEACA,6BAEE,yCAEF,2BAEE,6CAEF,2CAEE,4BAEF,2CAbA,yEACA,+BAEE,2CAEF,6BAEE,qBAEF,uBAEE,2CAEF,2BAEE,2CAfF,wEAGE,8BAEF,2CAEE,4BAEF,2CAEE,2CAEF,0BAEE,2CAfF,4BACA,2CAEE,6BAEF,2CAEE,2BAEF,6CAEE,2CAEF,4BAbA,yEACA,2CAEE,+BAEF,2CAEE,6BAEF,qBAEE,iEAIA,0BAQF,uEACA,2CAEE,6BAEF,2CAEE,2BAEF,uBAEE,oEAEF,yBAbA,0EACA,+CAEE,4BAEF,+CAEE,0BAEF,2BAEE,qCAEF,yCAEE,sBAfF,iEACA,yCAEE,yBAEF,yCAEE,uBAEF,2CAEE,yCAEF,2BAbA,sEACA,yCAEE,8BAEF,yCAEE,6BAEF,yCAEE,yCAEF,0BAEE,yCAfF,qEAGE,sEAIA,+CAEF,8DAEE,yBAEF,yCAQJ,oEACA,4BAEE,yCAEF,0BAEE,2CAEF,yCAEE,oEAIA,6BChEJ,yCAKE,8BAGA,yCAGA,4BCVJ,oJAIA,2BACA,qEACA,yCACA,0BCTE,oBACA,mBACA,yCDeE,uBACA,kEACA,yC1DqCA,0B0DvCA,iEACA,4CACA,qEAFA,uEACA,yCACA,wE1DqCA,6B0DvCA,2CACA,yCACA,oE1DqCA,6B0DvCA,yCACA,uEACA,4BAMJ,mFACA,mEACA,qEAIA,8BACA,mEACA,qFACA,4BACA,uEACA,yCAIA,gCEvCE,wCACE,iDvEUF,sBuELM,yCANN,0BACE,qEvEUF,yCuEXA,6BACE,oEvEUF,qBuELM,wBANN,2CACE,4BvEUF,2CuEXA,8BACE,0EvEUF,2CuEXA,6BACE,4CvEUF,2CuELM,2BALJ,wEvEUF,2CuEXA,8BACE,2CvEUF,4BuELM,qBFuCR,iEACA,0BAEA,uEACA,2CAIA,6BGtDE,2CACA,2BAEA,qBHuDF,mEAEA,4BACE,2CAMF,yEIhEE,+BAGF,2CCkBE,6B9EjBa,2C8EsBb,2CAKE,0BAEA,2CAEA,4B9E5Ba,2C8E+Bb,6BAIA,2C9EhCgB,2B8EqClB,uBACE,qBACA,+CAIA,yBACA,+C9E1CkB,0EELX,4B4EuDP,4GAOA,uB5ErEO,Q4EoEP,CACA,WADA,OACA,oBAJF,iB5EjES,e4EoEP,SACA,4HASA,sDAGF,uBACE,4BAEA,yBACA,4BAGF,2BACE,eACA,0CACA,CACA,+CAMA,wBAGF,0BACE,yBAGF,2BACE,yBAGF,yBACE,yBAGF,2BACE,2GAGF,yBAGE,yBAEA,qDAGF,4BACE,2BAIF,0BACE,yBAEA,yBAIA,qDAIA,4BAGF,2BACE,2BAGF,yBACE,yBAGF,2BAEE,0BACA,4BAGF,2BACE,6BAEA,kCAEA,4BAEA,kCACA,6BAKA,mCACA,+BAIA,yBACA,iCAEA,6BAEA,gCACA,uDAGF,yBACE,gCAEA,4BACA,yBACA,mDAGF,oBAEE,iDAGF,iEAKA,uBACE,4BAGF,uBACE,qEAIA,uBAIA,iDAGF,iEAKE,uBAEA,uBACA,uBAGF,2DAIE,uBACA,0BAGF,uBACE,iEAMA,uBACA,yBACA,uBACA,+DAIA,uBAIA,+CAIA,6DAOF,uBAEE,uBAGA,uBACA,2DAIA,uBAGF,uBAEE,+CAEA,uBACA,2BAEA,yBAGF,2BACE,yBACA,uBAMA,wBAIA,UANA,WACA,CAFF,UACE,CAEA,gBAIA,kCAIA,8BACA,wBAKA,8BAEA,CAHA,+BAGA,+CAIA,qBACA,4BAIA,uBAGF,2BACE,wBAEA,kBACA,CAFA,aAEA,CAIA,8CADF,wBAWE,CAVA,wBAOA,qBACA,kBACA,CALA,WADA,cACA,eADA,YACA,qBAMA,yBACA,aACA,CADA,2BACA,2CAEA,wCAGJ,sCACE,mzICvWF,KCuBE,6BACA,2CAHF,sBACE,iBAGA,qBAUA,yB9EiQ4B,a+E1PhB,CDbZ,wL9EuP4B,eChGxB,gBD2GwB,gBAKA,C8ExQ9B,QACE,CCaY,eADA,4BDFd,aCGc,uB3E1Cd,cAGI,iNAIA,yIAIA,+SAKF,uGACA,2OJ4R4B,eAEA,iBKzS9B,mBL0S8B,wCKjS9B,gBJqKM,wCIpKN,cJoKM,wCInKN,iBJmKM,wCIlKN,gBJkKM,wCIjKN,iBJiKM,wCIhKN,cJgKM,uBI9JN,iBJ8JM,gBD2IwB,4BKnS9B,cJwJM,gBDoIwB,gBARA,4BK/Q9B,gBJmJM,gBDqIwB,gBATA,4BK1Q9B,gBJ8IM,gBDsIwB,gBAVA,4BKrQ9B,gBJyIM,gBDuIwB,gBAXA,oBAzKrB,QK9EP,gCL8EO,mBKjFT,eAIE,8CAQF,aJkGI,gBD2H0B,4CA6CA,yBKpQ9B,YL6Q8B,CMhV5B,4DADA,gBDoFF,cCnFE,mCDsFF,oBACE,oDAEA,kBLqP4B,6BK1O9B,aJ2DI,yBIzDF,6BL4BO,kBKxBT,kBJqEM,oCAhBF,cIhDJ,aACE,cLxGS,2CK4GT,YACE,4BE/GF,YCJF,cDOE,gCPogCkC,qBA3gCzB,yBQST,qBCEE,CFPF,YEOE,cFPF,CCEF,cDCE,yBCcF,oBAEE,6BAIA,cADF,mBAEE,iCPiIE,cO9HJ,aRzBW,sBAyBD,qBC8HN,aD9HM,CUrCV,eAGE,wBAGA,aACE,qBVDO,wBASA,qBCoJP,UD7JO,CUOT,eTsJE,CSvJJ,mBDKI,yBCIA,cT8IA,iBS/IF,SV2Q4B,qBC5H1B,cStIJ,aACE,gBVfS,0BCoJP,aS9HA,CAFF,iBTgIE,CS9HA,iBACA,iCAKJ,gBVikCoC,kBU/jClC,qLCtCA,iBADA,iBACA,CAFA,iBACA,CAFA,kBACA,CCAA,UDGA,yBEmDE,yDDzCE,eZ+LiB,0BatJnB,uFDzCE,eZ+LiB,0BatJnB,qHDzCE,eZ+LiB,2BatJnB,mJDzCE,gBZ+LiB,uBYlKrB,YDnCA,eACA,CACA,kBADA,kBAEA,6BCuCE,cADF,cAEE,4EAIE,eAFF,eAGE,uwDEnDF,kBADA,kBACA,CAHF,iBACE,WAGA,sBAsBE,YACE,YACA,eACA,+BH4BN,aACE,eACA,+BAFF,YACE,cACA,+BAFF,uBACE,yBACA,+BAFF,YACE,cACA,+BAFF,YACE,cACA,+BAFF,uBACE,yBACA,2BGnBE,aHCJ,CACA,eADA,UAEA,wBGGQ,oBHbR,sBAIA,wBGSQ,qBHbR,uBAIA,wBGSQ,YHbR,cAIA,wBGSQ,qBHbR,uBAIA,wBGSQ,qBHbR,uBAIA,wBGSQ,YHbR,cAIA,wBGSQ,qBHbR,uBAIA,wBGSQ,qBHbR,uBAIA,wBGSQ,YHbR,cAIA,yBGSQ,qBHbR,uBAIA,yBGSQ,qBHbR,uBAIA,yBGSQ,aHbR,eAIA,8BGeI,qCAEA,kCAGE,OADW,0BACX,OADW,0BACX,OADW,0BACX,OADW,0BACX,OADW,0BACX,OADW,0BACX,OADW,0BACX,OADW,0BACX,OADW,0BACX,OADW,2BACX,QADW,2BACX,QADW,2BACX,QADW,2BAQP,uBHhBV,2BGgBU,wBHhBV,2BGgBU,eHhBV,2BGgBU,wBHhBV,2BGgBU,wBHhBV,2BGgBU,eHhBV,2BGgBU,wBHhBV,2BGgBU,wBHhBV,2BGgBU,eHhBV,4BGgBU,wBHhBV,4BGgBU,wBHhBV,yBEKE,wBC3BE,YACE,YACA,eACA,kCH4BN,aACE,eACA,kCAFF,YACE,cACA,kCAFF,uBACE,yBACA,kCAFF,YACE,cACA,kCAFF,YACE,cACA,kCAFF,uBACE,yBACA,8BGnBE,aHCJ,CACA,eADA,UAEA,2BGGQ,oBHbR,sBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,4BGSQ,qBHbR,uBAIA,4BGSQ,qBHbR,uBAIA,4BGSQ,aHbR,eAIA,iCGeI,wCAEA,qCAGE,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,8BACX,QADW,8BACX,QADW,8BACX,QADW,8BAQP,aHhBV,8BGgBU,uBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,8BGgBU,wBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,8BGgBU,wBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,+BGgBU,wBHhBV,+BGgBU,wBHhBV,0BEKE,wBC3BE,YACE,YACA,eACA,kCH4BN,aACE,eACA,kCAFF,YACE,cACA,kCAFF,uBACE,yBACA,kCAFF,YACE,cACA,kCAFF,YACE,cACA,kCAFF,uBACE,yBACA,8BGnBE,aHCJ,CACA,eADA,UAEA,2BGGQ,oBHbR,sBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,4BGSQ,qBHbR,uBAIA,4BGSQ,qBHbR,uBAIA,4BGSQ,aHbR,eAIA,iCGeI,wCAEA,qCAGE,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,8BACX,QADW,8BACX,QADW,8BACX,QADW,8BAQP,aHhBV,8BGgBU,uBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,8BGgBU,wBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,8BGgBU,wBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,+BGgBU,wBHhBV,+BGgBU,wBHhBV,0BEKE,wBC3BE,YACE,YACA,eACA,kCH4BN,aACE,eACA,kCAFF,YACE,cACA,kCAFF,uBACE,yBACA,kCAFF,YACE,cACA,kCAFF,YACE,cACA,kCAFF,uBACE,yBACA,8BGnBE,aHCJ,CACA,eADA,UAEA,2BGGQ,oBHbR,sBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,4BGSQ,qBHbR,uBAIA,4BGSQ,qBHbR,uBAIA,4BGSQ,aHbR,eAIA,iCGeI,wCAEA,qCAGE,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,8BACX,QADW,8BACX,QADW,8BACX,QADW,8BAQP,aHhBV,8BGgBU,uBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,8BGgBU,wBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,8BGgBU,wBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,+BGgBU,wBHhBV,+BGgBU,wBHhBV,2BEKE,wBC3BE,YACE,YACA,eACA,kCH4BN,aACE,eACA,kCAFF,YACE,cACA,kCAFF,uBACE,yBACA,kCAFF,YACE,cACA,kCAFF,YACE,cACA,kCAFF,uBACE,yBACA,8BGnBE,aHCJ,CACA,eADA,UAEA,2BGGQ,oBHbR,sBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,qBHbR,uBAIA,2BGSQ,YHbR,cAIA,4BGSQ,qBHbR,uBAIA,4BGSQ,qBHbR,uBAIA,4BGSQ,aHbR,eAIA,iCGeI,wCAEA,qCAGE,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,6BACX,OADW,8BACX,QADW,8BACX,QADW,8BACX,QADW,8BAQP,aHhBV,8BGgBU,uBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,8BGgBU,wBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,8BGgBU,wBHhBV,8BGgBU,wBHhBV,8BGgBU,eHhBV,+BGgBU,wBHhBV,+BGgBU,wBHhBV,yBXgFO,celIP,kBfkIO,CenIT,UgEsCc,qDhE7BV,6BAHF,cfoV4B,mBehV1B,iCAIA,gCADF,qBAEE,oCAGF,4BACE,2DAUF,af8T4B,CelT5B,sGAEA,wBAEE,mFAIA,uBAEE,oKAMJ,QAIE,0DASF,0BfyR4B,6C+EzThB,kC7E9BZ,aFyV4B,oGgB/V1B,wBD8FiC,wJCvF/B,oBDuF2E,CC3E1D,4JAMf,wBANe,0GAnBnB,wBD8FiC,gKCvF/B,oBDuF2E,CC3E1D,kKAMf,wBANe,oGAnBnB,wBD8FiC,wJCvF/B,oBDuF2E,CC3E1D,4JAMf,wBANe,2FAnBnB,wBD8FiC,4ICvF/B,oBDuF2E,CC3E1D,mJAMf,wBANe,oGAnBnB,wBD8FiC,wJCvF/B,oBDuF2E,CC3E1D,4JAMf,wBANe,iGAnBnB,wBD8FiC,oJCvF/B,oBDuF2E,CC3E1D,yJAMf,wBANe,8FAnBnB,wBD8FiC,gJCvF/B,oBDuF2E,CC3E1D,sJAMf,wBANe,2FAnBnB,wBD8FiC,4ICvF/B,oBDuF2E,CC3E1D,mJAMf,wBANe,0PAMf,iCANe,uC+DnBZ,wB/ESA,sBekGP,afmQ0B,wCAtWnB,wBALA,sBegHP,agE9GO,6BALA,wB/ESA,oGesHT,oBf+O4B,4CezO5B,QACE,qEAIA,0BfiO0B,wDA1WnB,sCEKT,UFuW4B,4Ba1S1B,qCEqGI,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,sDAGA,QACE,6BF1GN,qCEqGI,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,sDAGA,QACE,6BF1GN,qCEqGI,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,sDAGA,QACE,8BF1GN,qCEqGI,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,sDAGA,QACE,oCALF,iCAJJ,aAEI,CACA,eACA,CAFA,UAGA,mDAGA,QACE,CiE/JM,88DAEA,aAEI,CAJJ,yPAEA,aAEI,6BCbpB,aFLW,+BAOA,2B9DIT,C8DXS,qBAOA,C9DIT,wBACA,sBjBkR4B,a+E9RnB,c9DCT,CAGA,chB0KI,gBD2GwB,CiBvR5B,iCjB2esC,CApNV,eAKA,CA+MU,sBiBzetC,CAQA,qEAXA,UAiBA,uCCJI,8BDdN,eCeQ,4CDMN,wBACE,SACA,qC8DvBO,wBAmCG,qBA2D0B,C5DnFpC,iCAJF,a4DPS,CA8F6B,S/EsSV,4CiBtW5B,ajBvBS,UiB0BP,gFAQF,wB8DpCS,U9DwCP,oMAQF,uCACE,oDAMF,WACE,0BACA,sD8D9DO,sB9DiET,a8D1DS,wE9DsEX,aAEE,WACA,iCAaA,iBhBiEE,iBgBlEF,eACA,CAFA,kCACA,CAFF,+BjBoM8B,oCiB1L5B,iBhB0EI,iBgB3EJ,gCACA,CAFF,6BjBiI8B,oCiBxH5B,iBhBmEI,iBgBpEJ,iCACA,CAFF,8BjB2H8B,yCA1NnB,wBiBoHT,CACA,sCjB+J4B,aApRnB,CiB4GX,aACE,CAGA,chBoDI,gBDgHwB,CiBrK5B,eACA,CAFA,iBACA,CAFA,UASA,iHAIE,eAFF,eAGE,kCjB+F0B,oBiBjF5B,iBhB2BI,CgB7BN,gCjB6VwC,CChUlC,eDsDwB,CA0QU,oBSlepC,kCTuN0B,oBiBxE5B,iBhBmBI,CgBrBN,+BjBsVwC,CCjUlC,eDqDwB,CA4QU,kBSnepC,CQyJA,8HAIJ,WACE,6BAQF,kBjB2UwC,4BiBvUxC,aACE,kBjB4TsC,2BiBnTxC,YACE,eACA,CACA,iBADA,iBAEA,wEAIE,iBAFF,iBAGE,6BAUF,aACA,sBAFF,iBjBmSwC,mCACA,qBiB7RtC,gBjB6RsC,CiB9RxC,iBAGE,4HAGA,ajBvNS,mCiB6NX,eACE,oCAIA,kBACA,CAFF,mBACE,CAEA,oBADA,cjB+QsC,sDACA,ciBzQpC,qBjByQoC,CiB1QpC,YACA,CAFF,eAIE,iChBrFA,ckBxHF,YACE,CnB4coC,aCrVpC,CkBtHA,iBnB2coC,CmB5cpC,UFyNqC,gCEvMrC,0BACA,sBnBoO0B,amBrO1B,CAPA,YACA,CAGA,iBlBwHE,CkB9HF,MACA,ClB6HE,eDgHwB,CmBzO1B,gBACA,CAHA,cACA,qBACA,CAPF,iBACE,SACA,CACA,SVrCA,sGUmDA,QAEE,oFAKF,aAEE,wCASE,2QF+KiC,CEtKjC,wDC5EA,CHkPiC,2BEtKjC,CC5EA,2DDsFA,CCtFA,oBHkPiC,6CE5JjC,8CCtFA,qBpB2dgC,8EmB3XhC,uCFkJiC,CElJjC,4BFkJiC,gDExIjC,yJACA,uiBAoCuB,CArCvB,oEAqCuB,oGAKvB,8DACE,mIAaJ,cAnByB,kFAwBvB,6EAEE,oBAhJN,qFAOF,wBAGE,CF+MqC,oBE/MrC,mFAKA,gCAGA,CV7CA,+JUqDE,0FAOA,qDFwLmC,mCE/KjC,aACA,CF8KiC,YE/KjC,2CACA,kCAGA,0BF2KiC,sBE3KjC,cAFA,YACA,kBACA,CAFA,OAEA,gBADA,qDADA,oCF6KiC,0GE7JjC,oGCrFA,apB2dgC,0CmB3XhC,qUFkJiC,CElIjC,wDFkIiC,4BElIjC,CFkIiC,4DjByOD,iEiBzOC,oEEvHnC,iCAEE,gDFqHiC,mMEnGV,CFmGU,kCEnGV,2CAKvB,imBFmIF,CExIyB,oEFwIzB,iDAEA,oBAIF,iCAEE,gEAKF,2IAME,qFASA,cACA,8EAIA,oBACA,uFAMA,wBACA,CAFF,oBAEE,qFAGA,gCEzSF,CASA,mKAIA,oBACA,wEAGA,oBACA,iCV9CA,0HUqDE,sLAOA,mBAPA,YAKF,cAEE,mGCxEM,CCJmC,sBDInC,UCJmC,sDFqFvC,2GAEA,UACA,4DACA,CADA,aACA,gGAGF,aE5FyC,cF8FvC,CE9FuC,iCFyFvC,iBAKA,2IASA,gEACA,oHAUA,+CC9GI,CD8GJ,cnB2XgC,amB3XhC,kBnB2XgC,OmB3XhC,gBnB2XgC,gBmB3XhC,CnB2XgC,oCoBze5B,iBpBye4B,mBoBze5B,oIDwHJ,iOACA,uHAKA,2QElIuC,yDF+IvC,CE/IuC,4BF+IvC,4DAbA,iEAaA,sHE/IuC,mNFyJvC,4BEzJuC,0HF+JvC,6EAEuB,CEjKgB,kCFiKhB,4GAKvB,uiBALuB,6LA0BrB,2MAjJR,aAEE,iSAkBA,mLAOE,yZAgBE,6OAIA,iCCrFI,oXDoGJ,0LAUA,kRAUA,+DACA,cADA,YACA,4FAKA,8DElIuC,aFkIvC,kBAFF,OAEE,iCElIuC,mCFkIvC,CALA,iBAGF,UEhIyC,SFkIvC,wIElIuC,iPF+IvC,2HE/IuC,qUFgKrC,CACqB,yDADrB,2BACqB,6DAlBvB,oBAOF,6CAWyB,0HAMrB,+KAGF,uCATuB,CAMrB,4BANqB,8VA0BrB,imBDxKF,CC8IuB,oED9IvB,4HIOJ,qDtB8W0B,0JsBlW1B,8TCrBA,uLAcA,qMvB2CW,4NuBvE8K,iPrBO3L,gCqBP6D,CAqBzD,4XvBkDS,8LuBvE8K,kSAC3L,avBsEa,sBuBvE0F,wBAYvG,uBAEE,CAdqG,oBAqBnG,CrBdJ,cFgEa,qBuBvE0F,evBuE1F,eEhEb,CqBPuG,gBAcrG,sBAd2D,CrBO7D,iBqBP6D,CAqBzD,6HvBkDS,CuBvE0F,0CAA1C,qBvBuEhD,iMuB/BX,gCAxCyL,CAqC3L,SArC2L,kNA+CzL,iDDaF,wBC3DA,qBvBsEa,CuBnBP,avBmBO,oCEhEb,6CqBP6D,CvBuEhD,auBvEgD,uEAc3D,wBAd2D,qBAA0C,kCAYvG,aASI,6EAOF,wBvB2CW,sBuB7Cb,avB6Ca,wLuB/BX,wBAxC+I,qBAA0C,CAwCzL,aAxCyL,0MA+CzL,gCAKI,gCvBmBO,8CuBtEb,avBsEa,sCuBvEgD,wBAA0C,sBrBOvG,aqBPuG,2EAA1C,wBAA0C,sDAqBnG,CAPF,aAOE,iFvBkDS,8CuB3CX,avB2CW,8LuBvEoI,wBAA0C,sBAA1C,aAA0C,gNAoDrL,gCAnDN,8BvBsEa,6CEhEb,CFgEa,aEhEb,oCqBPuG,8CAA1C,aAA0C,oHAqBnG,kCArByD,aAqBzD,6EvBkDS,mPuBvE8K,qQAoDrL,gCAnDN,2BvBsEa,wBEhEb,sBFgEa,aEhEb,iCqBPuG,yKAqBnG,kCArByD,aAqBzD,uEvBkDS,0OuBvE8K,8CAA1C,aAA0C,iMAoDrL,gCAnDN,8BvBsEa,6CEhEb,CFgEa,aEhEb,oCqBPuG,8CAA1C,aAA0C,oHAqBnG,kCArBmG,aAqBnG,6EvBkDS,mPuBvE8K,qQDkE3L,gCtBKa,6BuBbqC,wBvBarC,sBEhEb,aFgEa,gFuBHb,CvBGa,auBHb,qEAEE,6CAGF,iCAGE,CANA,aAMA,2TvBLW,kQsBLb,gCtBKa,4BEhEb,wBqBmDkD,qBvBarC,8KuBDX,8EvBCW,CuBDX,avBCW,yEuBKX,6OvBLW,+PuBeX,gCDpBF,2BtBKa,6CEhEb,CFgEa,aEhEb,iCFgEa,4HuBHb,wBAEE,uDAFF,aAEE,uEAMA,0OvBLW,4PuBeX,gCAKI,sCvBpBO,qBsBLb,atBKa,4CuBbqC,wBvBarC,sBuBbqC,avBarC,uFuBHb,gCAEE,6FvBCW,wBuBKX,CvBLW,auBKX,gNvBLW,8CuBWX,avBXW,kOuBoBP,gCDzBN,wCtBKa,kCEhEb,8CFgEa,sJuBDX,iIAMA,4PvBLW,mSuBoBP,gCvBpBO,sCEhEb,oBqBmDkD,CvBarC,auBbqC,4CvBarC,kJuBDX,6HAMA,sPvBLW,6RsBLb,gCtBKa,mCuBbqC,oBvBarC,CEhEb,aFgEa,qLuBDX,uHAMA,6OvBLW,oRuBoBP,gCvBpBO,sCEhEb,oBqBmDkD,CvBarC,auBbqC,4CvBarC,kJuBDX,6HAMA,sPvBLW,6R+E7Ba,gC/EiIc,qCAEA,qB+EjId,a/EiIc,2CsBtFxC,wBtBsFwC,sBsBtFxC,atBsFwC,qFsB9EtC,gCAWJ,2Fb7FI,wBaiGJ,CbjGI,aaiGJ,6MtBsU8B,0RkBpatB,gCMjBJ,oCAUJ,oBACE,CALE,aAKF,0CAGA,6CNEI,CMHJ,aNGI,mFACE,yHOZN,wBCoBE,CDpBF,aCoBE,0MAzBF,wBAsDI,sBAtDJ,aAsDI,CD1CN,2NsDHW,gCtDkBT,mChBbE,oBgBuBA,ChBvBA,agBuBA,yCAKA,wBAEE,qBZYF,CYjBE,aZiBF,iFYjBE,gCAKA,uFALA,wBAIA,CAJA,aAIA,CACA,sMAPF,wBAEE,sBZiBF,aYjBE,yNzBmNwB,gC0BtP5B,2BACA,cADA,eACA,qBACA,iCACA,wCA8CE,gEDaA,yBAEA,uEzBkrBgC,a0B7tBhC,oBACE,4DAdJ,oBAiBI,iBAjBJ,iBAiBI,kBAhBJ,4DAyCI,oBADF,iBACE,iBAxCJ,oBAwCI,4BDsBA,+DAQF,gBACA,CACA,sIzBmK0B,U0B5NxB,qDAWA,uCACE,sBAGF,kD1B8MwB,+C0B1MtB,YA9BN,6BACA,wBACA,CADA,kBACA,kEAkCI,2CDsCF,yGACE,6GEzFJ,4CFmHA,CErHA,6BAEA,CAHA,qBACA,CF6GF,UE9GE,CF4FI,oBAYF,mBACA,sBAaF,8CAGA,azBiK4B,gC+EnRnB,4EACA,qBtD+IP,CsDgBgC,ctDxClC,YACA,0BsDuCkC,CtDzClC,OAkBE,esDzIO,CtDyHT,mDAJA,iBAEA,CsDyCkC,etDvBhC,CAlBF,qBAyBE,qCsDxIM,gEtD4IR,CsD5IQ,OtD4IR,yBsDzJS,uCtD6JP,0DASF,iBAIF,0BACE,uCAEA,iBsD7KS,yCtDgLT,SAIF,CAJE,OAIF,0BACE,uCsDxLS,0DnDCT,UAFF,OAEE,2BACA,uCACA,0DAGE,SACA,CADA,OACA,0EAKE,CALF,qBAKE,+QAKA,aAMN,2CAGE,6BAGE,CAHF,wBADA,KAIE,mDAQA,iGAFF,UAEE,CARA,6DAQA,yDnBPA,gEACA,0DmBeF,UnBFE,oBACA,CmBCF,YnBFE,CmBEF,WnBfE,KAcA,kDmBqBF,WAFF,oBACE,CACA,aADA,kBACA,yEASE,uDADF,2BACE,CAJA,UAGF,CANA,oBAGE,0CAIA,wDAKF,aACA,8QA4BA,yDAIE,6BAJF,QAEA,eAEE,gDAKA,kCAFF,UAEE,eALA,cAKA,gBALA,qBAGF,CAEE,sCALA,UAKA,2EnBhFA,yBADA,+BACA,6EmByFF,wBnBxGE,CAeA,+BAfA,iFmB4HF,wBAEE,CnB7HA,iCmB6HA,8NAIE,cAJF,aAEA,sBAEE,CACA,+DCtJJ,mBACA,CAHF,iBAEE,CACA,qBACA,0EACA,gCAEA,wVAQE,ujBAKE,mSAaF,sEAKA,cpBIA,0GoBGA,oJAEA,mBpBnBA,CoBiBA,oBpBjBA,qCACA,4JAcA,uUoBUA,CpBVA,4BoBUA,kIpBxBA,4ZoBmDF,sFAOE,gDADA,iBACA,kMAGE,+wBpB9EF,0MoB+HJ,S7BoWwC,0eSnepC,4BoBgJJ,CpBhJI,yBoBgJJ,gF7BkVwC,qD6B/TtC,sjCAWF,6dpB7JI,sDoBwKJ,iBpB3JI,qCACA,mDyE/CI,kBzE8CJ,CAbA,iDqBzBF,qBACA,CoDJM,cALA,azE+CJ,8CyE1CI,CzE0CJ,gBADA,sBACA,CyE1CI,iBzE2BJ,mBqBvBF,4GAIA,wHASA,+B9BufsC,8VA1CA,oB8BtbtC,iB9BsbsC,iBA3FV,kBA2FU,4GAiEQ,8X8Bvd9C,oBAFA,iBAEA,iBAJF,oBAIE,+F9BgcsC,qB8BrbpC,usBA0CA,4BACE,CADF,yBACE,CA0BA,+gBAKF,2B9B0X4C,C8B/X1C,wB9B+X0C,kE8B9W9C,4BAGE,CAHF,yBAGE,CACE,gC9BmY0C,gC8B3X1C,oB9B2X0C,oDADA,iB8BhY1C,UAOA,wC9B2X0C,qCA5iBrC,uCA2iBqC,mJkBniB1C,kIACE,gCYmLJ,wFAEE,8GAkBN,wBACE,qBACA,C9BgU8C,U8BhU9C,4IiDxNS,ajDgOT,0JrBpNE,wBqByNF,uC9B0PsC,e8BtPpC,CAFF,iB9BwPsC,C8BtPpC,gEiDlOO,8CjDuPP,CiDvPO,mBjDuPP,0FiDvPO,WAPA,aAOA,aAPA,a/EglByB,iB8B/VhC,WiDjPO,CAOA,UjDkQT,CAXE,4CiDzPO,gCjDoQT,+DAKA,oBACE,4F9B+NoC,4N8BrMxC,mGAKE,wBAIA,CAJA,oBAIA,kGAMA,0K9B4E4B,C8B9D1B,gNAKF,0BACE,4DASF,0G9BvD4B,2L8B0E1B,mGAKA,0BAEA,gCrBnWA,iFqBkXF,mBACA,CAFA,aACA,iCACA,4D9B0O2C,4C8BlOzC,CADA,uB9BmOyC,C8BvOzC,yBAIA,CAJA,uBAKA,iIACA,CAFA,sBAEA,uC9BiOyC,2D8B7NzC,0G9BxJ0B,qBAkXe,6BS1lBzC,qMTulByC,C8BpN3C,iO9B3YS,yBSQP,sBSEE,aYiYJ,CrBnYE,qBSEE,+BYyYF,iCACA,CZ1YE,gBY0YF,sCZ1YE,CYiYJ,sBrBnYE,UTulByC,sCA/Wf,oBAkXe,CS1lBzC,iCT0lByC,SS1lBzC,mLqBsaA,qBZpaE,CYoaF,gCZpaE,yCY4ZJ,wBZ3ZM,CY2ZN,aZ3ZM,wDYqaJ,+C9BuLyC,W8BlL3C,0B9BoKkC,mCSjlBhC,iBqBwbF,C9B0JkC,gCA1lBzB,C8B2bP,qBrBnbA,oBTRO,kB8BgcT,mCrBxbE,kBqB2bA,+B9BrE0B,qBAoOe,kBS1lBzC,CTsX0B,iBStX1B,qKqBmcA,0CZjcE,2BTFF,kBqBkcA,UACA,CrBncA,SSEE,6DACE,qDlB4lBqC,gI8BhJzC,wBACA,sEAKF,gB9B7dS,0E8BkeT,yBACE,oCAWE,mEAGF,C9B/eO,gBSMP,iCTNO,CSMP,OTNO,gBSMP,SqByeA,6EAJA,aACE,C9B5eK,e8B2eP,C9B3eO,uBSMP,+BqBufJ,CAdI,yC9B/eO,4E8B6fX,CAVI,QACE,C9BpfK,iB8BofL,yCAGF,CAHE,SASN,+BAGE,uCZxfI,CYqfN,wBAGE,CAHF,kCZrfM,yGYqfN,+CCngBE,uDAIA,+CAKA,+FAIE,iDAMA,6DgDsCgC,wChD5BlC,wBAEA,4BACE,CAJJ,8BACE,CAGE,8GtBVA,uGsEmCgC,ChD7BpC,UgD6BoC,uC/ElDzB,oD+BoCL,oGgD7CK,wBAqCG,8DtEdV,wBACA,sCsB8CF,CAZE,0BtBnCA,CsBiCF,YAEE,CgDIgC,UhDQlC,iDA2BE,eACA,CtBpFA,wBsB4DF,S/BvES,oBSWP,YTXO,2G+BuFP,uGAOA,CtBnFA,UsBoFA,uCACA,gDAWA,oBAEF,CACE,wECjGF,wBACA,iDAEA,2JAmCA,gBA9BE,wBACA,SACA,oBAPF,YAIA,iBACE,CALF,gCAOE,0GhCwrBgC,uGgC5pBlC,CAnCA,UAmCA,uC9B1CA,yC8BsDF,mBACE,gBACA,kDAGA,kEAQE,wBACA,mBASJ,CACE,mBAfE,WAGF,eACE,CAJA,uBhCwmBgC,uEgC1kBlC,mBACA,+CAQA,wB/B8DI,mB+B5DJ,CAHF,iBAGE,8DAEA,wBvBxGE,uEPFF,c8B8GE,0DAOF,wBAEA,0DAEA,cACA,mDhCmlBkC,wBgC9kBlC,gHnBtEE,4PAbA,sCmB6FA,YAoBI,gBACA,gCADA,cACA,2BAGE,iGAGE,wDhC4hBwB,uVgCjhB1B,iDAeA,8CAGF,wBAIE,oBAJF,aAIE,+FnB5IN,yUAbA,wBmB6FA,CnB7FA,UmB6FA,yEAqBI,aAEA,kBACE,mFAGE,2CAGF,uChCyhB0B,qcgC3f1B,+BAIA,qBnBhJN,oRmBmFM,eACA,CAFF,eACE,CnBnFN,cmBoFM,uCnBjGN,cmB6FA,CnB7FA,emB6FA,4CAqBI,wDAGE,6FAGE,kBAGF,CAHE,2BAGF,iChCyhB0B,iQgCjhB1B,kCAeA,CAfA,WhCihB0B,qBgClhB5B,YACE,uBhCihB0B,WgClgB1B,mDAGF,4CAIE,gSnB5IN,0FmBkFI,oBACE,2BACA,+CAJN,kBAoBI,8DACA,iBAEA,yDAGE,kBACE,CAHF,mBAGE,iShC4hBwB,uFgClhB5B,mDACE,sBAcF,gBACE,mDAGF,yCAIE,gSAvCF,yIAlBE,+CACA,kBAmBF,8DACE,iBAEA,yDAIA,kBhCyhB0B,CgC5hBxB,mBhC4hBwB,iSgClhB5B,gBACE,sDAeA,oEAGF,sBAIE,mEAIA,yCAcR,gShC+fkC,wDACA,iFAEA,2NgC7ehC,ChC6egC,mBgC7ehC,iShC0egC,sEAEA,0FExtBlC,mEFwtBkC,0CgC7clC,gShCpRS,yDgC6RP,kChC2bgC,wPACA,uUAEA,oSA3tBzB,0SgCuTP,eADF,eACE,+DAGF,0DhC8ZkC,uEAxtBzB,qTiCCT,gBAEA,mD8CES,iEtEMP,sBwBFF,gBACE,gDAIF,aAEE,gJxBIA,eACA,qDwBEA,eACE,qHxBWF,6EwBFA,eAIJ,2OAqBE,e/BrDA,+C+B6DA,sBjCyvBkC,CiC5vBhC,ejC4vBgC,oDiC9uBlC,wQ8C1B0B,4C9CwC1B,eAEA,CxBlFE,mJwBgGF,gBASF,gSAcE,mHxB9GE,eACA,yOIgCA,eoB6FJ,2HAaM,eAEA,qdxBrIF,uGwB8KQ,6IAKA,8QAUA,uFAKA,eAcV,CjCgmBkC,sSiCtkBhC,iCxBpOA,oBACA,wBwB0OA,CxB1OA,yBwB0OA,qCxBxPA,sBwBoPE,kCxBvOF,awBoOA,iBxBjPA,0BAVA,cwBsQA,cxBtQA,mCyBjBF,qBACA,CAFF,kBAEE,+CAIA,yCzBYE,2CyBLF,CAPA,kBAOA,8C6CNS,4C7CaL,CAJF,6C6CTO,C/E+hCyB,qBkClhC9B,+FAWF,wCAOF,a6C/BS,C7C4BP,4C6C5BO,6B5CPX,oBACE,gC1BiBE,gBHbF,mB6BCF,uCAEE,eACA,kCnCqxBkC,oB+E/uBR,uC5ChC1B,iDAKE,0B4CVO,6C5CgBP,C4CuBwB,e5C7BxB,CAFA,sBAQA,0CnC4wBgC,uDmCpwBhC,8B1BcA,0BACA,0C0BTA,CALE,sBAKF,yC1BNA,uDACA,mCsEfM,e5CgCR,C4ChCQ,qB5CgCR,sE4ChCQ,qBAPC,wD9EuKL,gCDqDwB,CoCtO5B,QACE,uBnCgLE,C8E1KK,iB3CPT,cpCsO4B,0FSzL1B,aACA,oE2BjCE,yC3BkBF,2CACA,4DTuM0B,4CoC/NxB,CnCyKA,6CmCzKA,kC3BqCF,kBACA,oD2BjCE,+B3BkBF,kBACA,CADA,kBACA,kC4B9BJ,QACE,CACA,epC6JE,iBD4H0B,CqC1R5B,iBrC0R4B,oCqCrR5B,kBACA,yBACA,4B5BKE,mI4BHF,anBKI,CmBLJ,anBKI,oDACE,4BhBLN,CgBKM,yBhBLN,kImCuBF,yBrCi4BoC,qIA51BrB,iFsCrET,4BADA,wBACA,oIANJ,wBtC2Ea,uIsCrET,iEAGF,oBAEE,uDACA,cDqCJ,mBCjDA,UtC2Ea,6EE5Db,6BoCVI,oBACA,sGAKA,eACA,CDqCJ,2BCjDA,CAYI,4BAZJ,sDtC2Ea,yBE5Db,yBoCVI,+CACA,+DANJ,wBtC2Ea,sBsChET,2BACA,CDqCJ,eCjDA,CAYI,kBDqCJ,CCrCI,mBtC+DS,mDE5Db,kBoCVI,0DACA,aAKA,aALA,8BAKA,gEDsCJ,yBCjDA,CtC2Ea,oBsC3Eb,CpCeA,wCoCTI,0CAKA,qBALA,aAGF,eAEE,CALA,cAKA,4BtCgES,8CsCtET,CtCsES,cqC1Bb,aCjDA,CtC2Ea,kCsC3Eb,qBAYI,iBAPA,kCACA,wBAKA,sBALA,4CAKA,kCDsCJ,gCrC0Ba,CsC/DT,SDqCJ,CCrCI,StC+DS,mDsCtET,gCACA,CpCSJ,6BoCVI,CtCsES,asCrET,kDAKA,iCACA,CAHF,8BAGE,8CtC6yB8B,wBSxyBhC,sBTwyBgC,oBSxyBhC,gD8BNJ,qBAEE,qB9BIE,C8BVA,cAIJ,YAJI,mB9BUA,2C+BZF,iBxCy9BkC,iBwC19BlC,qBxC09BkC,kEwCh9BlC,+BxCiR4B,CwCnR9B,4BxCmR8B,iEwChQ5B,gCAGE,CANF,6BAOE,2CAEA,iBAWmH,iBAXnH,oBAWmH,kEC3CnH,gCADF,4BACE,iED2CuB,gCAA4C,CADrE,6BACqE,wBAAgD,oBAA5F,CC5CzB,qBACE,6BAGF,cACE,CALF,kBACE,CAIA,kBDuCuB,6HCvCvB,CDsCF,sBACqH,CCvCnH,yDDuCmH,sCAA5F,8DC5CzB,oBACE,8BAGF,YACE,6BDsCF,iBACqH,sCC5CrH,oBD4CqE,iBC5CrE,CD4CyB,kBC5CzB,gCACE,wBAIA,CAJA,aAIA,6EDuCmE,yBAA5C,aC5CzB,6EAKE,gCDuCmH,CCxCrH,SDwCqH,kCAAhD,yBAA5C,aAA4C,iFCvCnE,wBDsCF,CCtCE,aDsCF,iFC3CA,gCACE,CD2CmE,SC3CnE,gCAIA,wBCPA,CDOA,aCPA,6EAMF,wB1Ck+BkC,C0Cn+BpC,aAGE,6EjCOE,gCiCEF,C1CXS,S0CWT,6BAEA,wB1CfS,C0CcT,a1CdS,uEA0+ByB,wB0Cr9BlC,C1Cq9BkC,a0Cr9BlC,uExBPM,gCwBUR,CxBVQ,SwBUR,2KCYE,CDZF,aCYE,6EDNA,gCACE,CADF,SACE,+BAGE,wBAJJ,CAII,aAJJ,CAKM,0EExCN,wBAIA,CAJA,aAIA,2ECIA,gCpCQE,CoCTF,SpCSE,8BsEZO,wBlCiBT,CAFA,aAEA,yE3CPA,wB6EVS,ClCiBT,akCjBS,yEAMA,gCA8BG,CA9BH,SA8BG,CA/BH,4BlCiCX,wBAEE,CkCnCS,alCmCT,uEkC4BkC,wBlCvBlC,CkCuBkC,alCvBlC,uEpCxBE,gCACA,CADA,SACA,4BAaA,wBACA,qBoCeF,kBpChBE,CoCgBF,iBpCfE,qEoCmBF,mCkCakC,gBlCVhC,ckCUgC,ClCVhC,ekCUgC,wBAtD1B,4CAPC,kBAOD,ClCkDN,sBkCzDO,ClCwDT,iBkCjDQ,gClCwDR,aACE,gFAEA,kBACE,2CAgBA,qC7C4IwB,iB6C7I1B,CACE,QADF,MACE,yCAGE,wBpC1BJ,qBAZA,CoCsCI,apCtCJ,2DoC2CI,4CpC3CJ,aAYA,0DoCqCM,sBpCrCN,aoCqCM,6DAGF,8CAEE,qEAGE,qB7CsHkB,C6CzHpB,a7CyHoB,mCahL1B,oEgCoCE,0CAGE,6CpC1BJ,CoCuBE,apCvBF,gCAZA,iEoC2CI,apC3CJ,gCAYA,8FoCqCM,oEAGF,a7C2HsB,+B6CzHpB,6FAGE,wB7CsHkB,2CahL1B,2CgCoCE,4FAGE,wBpC1BJ,0CAZA,0CoC2CI,wBpC3CJ,qBAYA,CoC+BI,apC/BJ,iGoCqCM,iDAGF,0B7C2HsB,2B6CzHpB,4BAGE,wB7CsHkB,qBahL1B,CgCuDM,aAEA,gBACE,CAHF,yBAEA,CAFA,ehCvDN,+BgCuCI,wBpC1BJ,CoCuBE,WhCpCF,YgCmCA,sBACE,yDAGE,CpC1BJ,yBAZA,CoCsCI,kBpCtCJ,qEoC2CI,epC3CJ,wCAYA,+GoC0CM,kEAEA,iD7CuHoB,uCahL1B,uCgCoCE,6DAGE,CAHF,YAGE,6BpC1BJ,qCoC+BI,qBpC3CJ,kDoC2CI,CpC3CJ,coC2CI,yCpC/BJ,wITmK0B,wB6CzHpB,CAFF,kC7C2HsB,C6C9HpB,SAKA,wEAGE,CAHF,aAGE,kCpCpGR,0BoCsHF,sCACE,CAJJ,oCpCnHI,CT0N0B,iB6CnG1B,8CAEA,8BACE,gCCzIJ,6CDqJyC,yJC9InC,2BD8IkE,aC9IlE,6DD8IkE,yDkCrJ/D,SlCqJ+D,mEAA/B,gH3CxIzC,C2CwIyC,e3CxIzC,wC4CNM,uFiCPG,gClCqJ+D,8FAA/B,sI3CxIzC,0E4CNM,mBAGF,CAHE,oBAGF,iFAVJ,qBDqJwE,0CAA/B,oIAA+B,gCC9IlE,iGD8IkE,6HAA/B,4GAA+B,CAA/B,oBAA+B,oFC3IpE,qBiCVK,CjCOH,gBiCPG,0BlCqJ+D,oIAA/B,iIC9InC,6HD8IkE,yFAA/B,4HAA+B,sBAA/B,gBAA+B,EC9IlE,oFiCPG,wElCqJ+D,0DAA/B,kG3CxIzC,C2CwIyC,8B3CxIzC,mE4CNM,yFD8IkE,mBEvJxE,CFuJwE,oBEvJxE,oFAMA,qB7CKA,C6E8G8B,gB7E9G9B,2B6ETS,0ChCSP,0FAKE,gCAWN,0BACE,uEC7BF,2BhD64BoC,C+Cv2BlC,8B/Cu2BkC,mE+ElvBA,Y/BnJlC,6EAGA,mBvCOE,CuCTF,oBvCSE,oFuCCA,sBhD23BgC,gBgD33BhC,oCAKA,mEAQJ,oBACE,+D+B1BS,qBAyJyB,0C/B1HlC,wBACA,CADA,aACA,6ICjCF,wBAEE,CjDs4BkC,aiDt4BlC,wEASF,wBAGE,qBjD4pBkC,CiDpqBhC,UjDoqBgC,4CiDppBlC,yBAHA,aAGA,CAOF,gJASI,wBjDu6BgC,CiDv6BhC,ajDu6BgC,0EkB97B5B,6C+B0BN,CAJA,UAIA,0CjDq6BkC,wBiDh6BlC,CjDg6BkC,aiDh6BlC,6IASA,wBACE,CAHF,aAGE,wEACA,6CAGF,CAHE,UAGF,uCAEE,wBAIA,CAJA,aAIA,uIAUF,wBACE,CAJF,aAIE,qEAGA,kGAMA,wBACA,CAFA,aAEA,6IAMA,wBACE,CAJA,aAIA,wEAUJ,wBAGA,qB8BxEY,C9BoEZ,U8BpEY,yC9B0EZ,wBACA,CADA,axCjGE,2ITDO,wBiDqHT,CjDrHS,aiDqHT,uEAMF,wBACE,qBACA,CjDuzBkC,UiDvzBlC,wCjD8zBkC,wBiD3zBlC,CjD2zBkC,aiD3zBlC,yIjD2zBkC,wBiDrzBhC,CjDqzBgC,aiDrzBhC,sEAYJ,wBAIE,qBjD0wBkC,CA7oBN,UA6oBM,uCiDnwBlC,wBACA,CAFA,aAEA,uIxCtIE,wBACA,CADA,aACA,qEwCoJJ,wBAEE,qBAEA,CAJF,UAIE,wBjD8wBkC,WiD7wBlC,YpCvIE,gCoC6IF,cjDuwBkC,CiDrwBhC,WjDqwBgC,wBiDrwBhC,8BAGF,+BACE,uHAOF,yCACE,wBAEA,UAFA,SAEA,kCACE,2CpC9JF,2BoC2KF,CpC3KE,2BoC2KF,0BpC3KE,Cbk5BgC,oBkD58BlC,CrC0DE,oCbk5BgC,CiDnvB9B,gBAQJ,CjD8uBkC,iBar5BhC,CoCuKF,ejD8uBkC,CAHA,SkD58BlC,yClD+1BkC,yLA7kBN,kBmDjR5B,CAIA,2BACA,CnD4R4B,0BmD7R5B,CACA,iCAGA,0CAEA,2CAEA,CnDgR4B,aAKA,CA6jBM,YA7kBN,CmDjR5B,qBAYA,6BDJA,cACA,6BAEA,elDg1BkC,oCkD90BlC,iBAEE,gBlDi1BgC,wBkD70BhC,YACE,CACA,YlD40B8B,MkD90BhC,CAGE,SACA,CAFA,eACA,ClD20B8B,qBkD50B9B,WAFF,YAIE,+DAKN,CALM,4BAKN,2CACE,2BAEA,CAFA,iCAEA,uCACE,qGAGE,cACA,mDlDtBK,+DkD4BX,YACE,mHlDszBkC,gBADA,4HkD7yB9B,sDlDrCK,mHkD6CT,+CAGE,WAHF,kEAGE,wGAGE,CACA,YADA,sBACA,+ElDpDK,sFkD2DT,4ClDuxBkC,2EkD/wB9B,oBACA,CANF,YlDqxBgC,sBADA,CkD9wB9B,UlD8wB8B,oBkDvxBlC,iBAGE,ClDoxBgC,UkD9wB9B,iClD9EK,qBkDwGT,CAFA,YlDtGS,CkDoGX,MlD+uBoC,CAz0BzB,ckD0FX,OlD+uBoC,WkD7uBlC,ClD6uBkC,YkD3uBlC,sCzC7FE,+C2ChBF,UACA,+BpDi3BkC,0IoD/2BlC,YpD+2BkC,iFAhlBN,6BmD9R5B,CAHA,YAGA,8BAGA,gBADA,eAEA,6BAEA,aACA,cAFA,iBAEA,+BlDuKI,kBmDxKJ,C3CME,2C2CGA,CANF,4C3CGE,C2CJF,4BACA,CDAA,YlDqKI,gBmDxKJ,wBpDLS,eoDcP,iCAGA,uDAIE,YACA,eACA,CANF,6BAEA,WAIE,yBACA,8BACA,6EAKN,8BpDg2BoC,wFoD71BlC,wCACE,wGAGE,2BACA,8CpD21B8B,6FoDv1BhC,epD2L0B,2BoDzLxB,0BpD5CK,2CAi4ByB,oBoDh0BhC,CpDjEO,aoDkDX,CpD40BoC,wLoDr0BhC,CpDw0BgC,kBoDx0BhC,kCAIE,qBpDo0B8B,iBoDx0BhC,gBAPJ,QpD40BoC,CAzpBN,UArOnB,kBoDyDP,gCAEA,qBACE,iBACA,qBpDo0B8B,yDAj4BzB,YAqOmB,+BoDlKxB,2CpDnEK,gGA83ByB,sJoDjzBhC,iHAIE,wHAIF,qBpDgJ0B,CA4pBM,0BoD5yBhC,CpD4yBgC,KA5pBN,wFArOnB,qHoDgGP,YACA,CAFA,OACA,WACA,CpD4xBgC,mHoDpxBpC,uBpDqxBoC,CoDzxBhC,gCAIJ,CAJI,OpDyxBgC,0FoDlxBlC,uHAIE,2HpDixBgC,oDoD7wB9B,QpD6wB8B,sFA5pBN,gBoD3GxB,mGnDmDA,amD1BJ,QnD0BI,YDusB8B,iHS/1BhC,sB2CsIA,C3CtIA,iCADA,M2CuIA,gCCrJJ,qBACE,sBrDES,WoDsJX,eACE,qBpDvJS,kBqDFT,CAGF,yBnCIQ,oBmCiBR,CAGE,4BAHF,qBAGE,4CAnBA,aACA,CACA,wLASA,CnCZM,kBmCYN,kCAfA,MAGF,CnCDM,qBACE,iBmCYN,eACA,CAXA,eACA,CANA,kBAgBA,gCACA,sCnCfI,qBmCFJ,MnCGM,yDmCAR,YAoBE,iCAKA,0CAFF,iBAEE,yFAcA,kBACE,mBACA,CAXF,UASA,CATA,+BAWE,CACA,wMAGF,yBAIE,gHAMA,0BACA,CAFA,0BACA,CAHF,QAIE,8GnCxDI,sBADF,0BACE,CADF,UACE,wFmCqEN,iBAGA,sGrDy9BmC,YqDn9BnC,uBAEA,CrDi9BmC,cqD/8BnC,CrD+8BmC,WqD/8BnC,oHnClFM,8DmCiER,MnCjEQ,kHmCwFJ,uBrD08BiC,CAhjC1B,gCqDsGP,CnD7FF,QFuiCmC,0FqD/7BnC,wHrD48BmC,4IqD37BrC,8BAFE,0BAEF,CAFE,KAEF,oHAiBE,wBrD25BmC,CqD55BnC,0BACA,CAFA,OrD65BmC,wIA9iC1B,+BqDoKP,CrDpKO,WAsjC0B,aqDr5BjC,CrDq5BiC,SqDp5BjC,kBrDlKO,CAojC0B,iBAEA,OqDr5BjC,UAGA,sFAIA,kBACA,oGAGF,WACE,gBnC/JI,oCmC+JJ,kHAkBF,2BEjMA,CvDES,gCqD+LT,CAFA,OE/LA,gHAQA,sBACA,CvDmkCwB,gCuDpkCxB,CvDokCwB,SuDnkCxB,iCAGA,wBvDmkCwB,gCAEA,yCuDpjCxB,0CAEE,CAnBF,+BADA,oBAoBE,uCvD2iCsB,2CAEA,auDpiCxB,CvDoiCwB,oBuDpiCxB,2BAGA,0DACA,kBAGF,iCAME,gBvD0hCwB,4BuD1hCxB,uCACE,UAEE,YAFF,aAEE,gCC1DN,6DACA,CAFA,wBACA,mBADA,kBAEA,qCAFA,UAEA,uCACA,8CACA,gHACA,aCFE,0GACE,oIAKE,2BANJ,+CACE,gYvDUF,mCuDLI,CvDKJ,SuDLI,uCANJ,qHACE,2IADF,QACE,0DvDUF,CuDVE,UADF,kBACE,kBADF,MvDWA,6BuDVE,mBvDUF,uCuDXA,8EACE,sVvDUF,yFuDVE,mCADF,gCACE,CADF,UACE,6PvDUF,6CwDJF,iNCLA,sCACA,SACA,oCADA,OAEA,gBADA,eACA,CADA,gCADA,oCAEA,yCAIA,2BACA,CADA,sBACA,8BACA,CADA,4BAHA,mBAEA,eAFA,cACA,4CAGA,WAHA,kBACA,CAEA,2BAGE,CAPF,UAOE,uCACE,wCADF,eACE,+CADF,uDACE,qBADF,mBACE,iBADF,6BACE,4BADF,qDACE,kCAKF,6CAQA,CATF,kBACE,mBADF,8BACE,CANA,oBACE,YADF,uBACE,WAaF,oCAIA,8BADF,UACE,CAGF,6CACE,6DAMA,2CAGF,CAJE,6BACA,mBALA,oBAGF,aAEE,UAFF,sBACE,CADF,UAKA,kCACE,WACA,CADA,UACA,uCAGF,8DACE,uBACA,kCAGF,gCACE,4BAGF,4BACE,+BAGF,+BACE,CAGF,8BACE,+BLxEA,oCAGE,oCMOE,2/B/CiDF,kC+CjDE,sgB/CiDF,kC+CjDE,ogCAUN,uCAEI,wgBCrBJ,iCAEE,8BAEA,gCACA,8BAGE,+BACA,8MAGF,0BAQE,8BAGA,qEASA,yCACE,qJCzBF,2CDwBA,2CCxBA,+BAEA,2CADA,uCACA,6BACA,yFAEA,4DACA,qDACA,iCACA,sBADA,aACA,+CACA,mDACA,iCACA,wDACA,wEAEA,wFACA,qDACA,mFACA,0EACA,0FAEA,2DACA,oDACA,mFACA,8DACA,qFAEA,uDACA,+EACA,4DACA,kFACA,qDACA,6FAEA,wDACA,yDACA,uDACA,+EACA,4DACA,2DjDYA,uBiDlDA,oDACA,8FACA,wDACA,sFAEA,sDACA,oDACA,4DACA,2DACA,oDACA,wDACA,6DACA,wDAEA,sFACA,mEACA,gGACA,8DACA,8EAEA,oGACA,2DACA,4DACA,iEACA,6BAEA,CAFA,sCAEA,8RAIA,qCADA,iBACA,iEACA,wEAEA,iEACA,8DACA,2CACA,yFACA,uEACA,sCjDYA,uCiDlDA,oDACA,4FACA,4DACA,0EAEA,mDACA,uDACA,+FACA,oCACA,sCACA,2EACA,0EACA,uCAEA,+EACA,oEACA,qGACA,mEACA,iGAEA,wEACA,oEACA,qEACA,6EACA,uCAEA,4EACA,0FACA,kEACA,+DACA,oGACA,kEAEA,qDACA,yDACA,sGACA,oCACA,gFACA,uDjDYA,iCiDlDA,iEACA,+DACA,6EACA,sDAEA,0DACA,qGACA,oCACA,2EACA,4CACA,6EACA,uCACA,kFAEA,uEACA,mEACA,oEACA,yEACA,8GAEA,yEACA,iCACA,uEACA,gFACA,8EAEA,0EACA,8DACA,qEACA,wGACA,oEACA,qEAEA,sDACA,yDACA,sGACA,oCACA,gFACA,uDjDYA,iCiDlDA,iEACA,+DACA,6EACA,uDAEA,yDACA,qGACA,oCACA,2EACA,4CACA,6EACA,uCACA,kFAEA,uEACA,mEACA,oEACA,iHACA,sEAEA,yEACA,0EACA,8BACA,gFACA,8EAEA,0EACA,8DACA,qEACA,wGACA,oEACA,qEAEA,sDACA,0DACA,qGACA,oCACA,gFACA,uDC1CA,2DACA,uCACA,+DlDoDA,uBkDtDA,sDACA,sDACA,mClDoDA,0DkDtDA,uBACA,+EACA,yClDoDA,kCkDtDA,4CACA,6EACA,uCAFA,kFACA,uCACA,qECLF,kYCCA,qVAOA,yBjEmqBkC,sCiE7pBpC,+BAIE,oCjEypBkC,oEiErpBpC,oEjEopBoC,6BkEvqBlC,wCAGA,4BAEA,2BACA,6BAEA,4FAaE,sCAGA,oCACA,yCC7BJ,sEACA,yDACA,iGACA,+BCCI,6bAIJ,6EACA,uCAIA,4CACA,uCAEA,sEACA,qCCTQ,sEAGE,sEAIA,uEAIA,sEAIA,kCAfF,uEACA,0CAEE,8BAEF,2CAEE,qCAEF,0CAEE,oCAIA,2CAfF,oEACA,yBAEE,sCAEF,+BAEE,oCAEF,6BAEE,uCAEF,2BAEE,yCAfF,qEACA,4BAEE,8BAEF,oBAEE,mDAEF,6BAEE,6CAEF,+BAEE,oBAfF,sDACA,gCAEE,8CAEF,+BAEE,qDAEF,qBAEE,oDAEF,0BAEE,+BAfF,qDACA,qBAEE,oDAEF,2BAEE,+BAEF,qDAEE,qBAEF,gCAEE,oBAfF,oEACA,0BAEE,mCAEF,kCAEE,8DAIA,6DAEF,CAEE,+BAfF,kFACA,kCAEE,yBAEF,oCAEE,+DAIA,4DAEF,wBAEE,kCAfF,2DACA,4BAIA,OAFE,6BAEF,2CAEE,QAEF,QAFE,uBAEF,uEAIA,4BAEE,uBAfF,8DAKA,kBAEE,UAJA,sCAEF,CAFE,UAFF,kBAME,mBANF,SAME,oFAPF,UAaA,WAEE,kBAJA,eAEF,CAbA,mBAaA,UAbA,kFAGE,oEAIA,6EAIA,uDAEF,uBAEE,mBAfF,iEACA,mBAEE,4CAEF,yBAEE,2CAEF,2CAEE,2CAEF,oBAEE,wBAQF,mEACA,iDAEE,yBAEF,sDAEE,yBAEF,uDAEE,yBAEF,8CAEE,sBAfF,qFAGE,mEAEF,wBAEE,6CAEF,yBAEE,6CAEF,uBAEE,sBAfF,oEACA,2BAEE,6CAEF,6BAEE,6CAEF,8BAEE,yEAIA,4CAfF,uEACA,6CAEE,4BAEF,6CAEE,6BAEF,6CAEE,2BAEF,sBAEE,qBAfF,sEACA,6CAEE,2BAEF,6CAEE,4BAEF,6CAEE,gDAEF,uBAEE,6CAMN,wEAGE,0EAIA,2EAEF,4BAEE,2CAEF,6CxDPA,yBwDlDI,wEACA,6CAEE,4BAEF,6CAEE,0BAEF,sBAEE,gEAIA,wBAfF,kHAGE,uEAIA,sEAEF,6CAEE,4BAEF,6CAbA,2EACA,+BAEE,6CAEF,6BAEE,6CAEF,6CAEE,wEAIA,6BAfF,2EACA,6CAEE,4BAEF,sBAEE,mEAIA,uEAEF,4BAEE,6CAfF,0EAGE,iDAEF,wBAEE,6CAEF,4BAEE,2EAEF,6CAbA,4EACA,6BAEE,4CAEF,6CAEE,0BAEF,6CAEE,4BAEF,6CAEE,6BAfF,6CACA,2BAEE,+CAEF,+CAEE,4BAEF,+CAEE,8BAEF,+CAbA,8EACA,6BAEE,8CAEF,+CAEE,2BAEF,+CAEE,4EAIA,8BAfF,2EACA,uBAEE,qEAIA,yEAEF,4BAEE,+CAEF,6BAEE,+CAfF,4BACA,8CAEE,+CAEF,4BAEE,+CAEF,8BAEE,+CAEF,+BAEE,+CAfF,oDACA,sBAEE,+CAEF,yEAEE,4BAEF,+CAEE,6BAEF,+CAbA,yEACA,mDAEE,yBAEF,mDAEE,2BAEF,mDAEE,4BAEF,mDAUA,2EACA,qEAEE,sBAEF,mDAEE,wBAEF,mDAEE,4EAIA,uBAfF,mGAGE,8EAIA,gFAEF,8BAEE,mDAEF,4BAEE,yBAfF,yEACA,0BAEE,mDAEF,4BAEE,mDAEF,6BAEE,mDAEF,2BAEE,yBAfF,wEACA,yBAEE,mDAEF,2BAEE,+EAEF,mDAEE,0BAEF,yBAEE,uBAfF,8EACA,mDAEE,6BAEF,mDAEE,8BAEF,mDAEE,4BAEF,yBAEE,qBAMN,4EACA,mDAEE,2BAEF,mDAEE,+EAIA,mDAEF,mBAEE,mDA3DE,0EACA,yBAEE,mDAEF,0BAEE,mDAEF,wBAEE,iDAEF,mDAbA,+EACA,8BAEE,mDAEF,+BAEE,mDAEF,6BAEE,gDAEF,mDAbA,8EACA,6BAEE,mDAEF,8BAEE,mDAEF,4BAEE,yBAEF,yEAbA,6EAGE,+EAIA,gFAIA,oDAEF,wBAEE,mDAfF,+EAGE,iFAIA,kFAIA,sDAEF,sBAEE,mDAfF,6EAGE,+EAIA,gFAIA,qDAEF,wBAEE,qDAfF,4BACA,qDAEE,8BAEF,qDAEE,+BAEF,qDAEE,6BAIA,0BAfF,4EACA,2BAEE,qDAEF,6BAEE,qDAEF,8BAEE,qDAEF,4BAEE,0BAfF,2EACA,0BAEE,qDAEF,4BAEE,qDAEF,6BAEE,qDAEF,2BAEE,0BAfF,6EACA,4BAEE,qDAEF,8BAEE,qDAEF,+BAEE,qDAIA,6BAfF,qGAGE,+EAIA,iFAIA,kFAIA,2BAfF,0GAGE,kFAIA,oFAIA,4BAEF,yDAUA,4EACA,qEAEE,sBAEF,mDAEE,wBAEF,mDAEE,4EAIA,uBAfF,mGAGE,8EAIA,gFAEF,8BAEE,mDAEF,4BAEE,yBAfF,yEACA,0BAEE,mDAEF,4BAEE,mDAEF,6BAEE,mDAEF,2BAEE,yBAfF,wEACA,yBAEE,mDAEF,2BAEE,+EAEF,mDAEE,0BAEF,yBAEE,uBAfF,8EACA,mDAEE,6BAEF,mDAEE,8BAEF,mDAEE,4BAEF,yBAEE,qBAMN,4EACA,mDAEE,2BAEF,mDAEE,+EAIA,mDAEF,mBAEE,mDA3DE,0EACA,yBAEE,mDAEF,0BAEE,mDAEF,wBAEE,iDAEF,mDAbA,+EACA,8BAEE,mDAEF,+BAEE,mDAEF,6BAEE,gDAEF,mDAbA,8EACA,6BAEE,mDAEF,8BAEE,mDAEF,4BAEE,yBAEF,yEAbA,6EAGE,+EAIA,gFAIA,oDAEF,wBAEE,mDAfF,+EAGE,iFAIA,kFAIA,sDAEF,sBAEE,mDAfF,6EAGE,+EAIA,gFAIA,qDAEF,wBAEE,qDAfF,4BACA,qDAEE,8BAEF,qDAEE,+BAEF,qDAEE,6BAIA,0BAfF,4EACA,2BAEE,qDAEF,6BAEE,qDAEF,8BAEE,qDAEF,4BAEE,0BAfF,2EACA,0BAEE,qDAEF,4BAEE,qDAEF,6BAEE,qDAEF,2BAEE,0BAfF,6EACA,4BAEE,qDAEF,8BAEE,qDAEF,+BAEE,qDAIA,6BAfF,qGAGE,+EAIA,iFAIA,kFAIA,2BAfF,0GAGE,kFAIA,oFAIA,4BAEF,yDAUA,4EACA,qEAEE,sBAEF,mDAEE,wBAEF,mDAEE,4EAIA,uBAfF,mGAGE,8EAIA,gFAEF,8BAEE,mDAEF,4BAEE,yBAfF,yEACA,0BAEE,mDAEF,4BAEE,mDAEF,6BAEE,mDAEF,2BAEE,yBAfF,wEACA,yBAEE,mDAEF,2BAEE,+EAEF,mDAEE,0BAEF,yBAEE,uBAfF,8EACA,mDAEE,6BAEF,mDAEE,8BAEF,mDAEE,4BAEF,yBAEE,qBAMN,4EACA,mDAEE,2BAEF,mDAEE,+EAIA,mDAEF,mBAEE,mDA3DE,0EACA,yBAEE,mDAEF,0BAEE,mDAEF,wBAEE,iDAEF,mDAbA,+EACA,8BAEE,mDAEF,+BAEE,mDAEF,6BAEE,gDAEF,mDAbA,8EACA,6BAEE,mDAEF,8BAEE,mDAEF,4BAEE,yBAEF,yEAbA,6EAGE,+EAIA,gFAIA,oDAEF,wBAEE,mDAfF,+EAGE,iFAIA,kFAIA,sDAEF,sBAEE,mDAfF,6EAGE,+EAIA,gFAIA,qDAEF,wBAEE,qDAfF,4BACA,qDAEE,8BAEF,qDAEE,+BAEF,qDAEE,6BAIA,0BAfF,4EACA,2BAEE,qDAEF,6BAEE,qDAEF,8BAEE,qDAEF,4BAEE,0BAfF,2EACA,0BAEE,qDAEF,4BAEE,qDAEF,6BAEE,qDAEF,2BAEE,0BAfF,6EACA,4BAEE,qDAEF,8BAEE,qDAEF,+BAEE,qDAIA,6BAfF,qGAGE,+EAIA,iFAIA,kFAIA,2BAfF,0GAGE,kFAIA,oFAIA,6BAEF,wDAUA,6EACA,qEAEE,sBAEF,mDAEE,wBAEF,mDAEE,4EAIA,uBAfF,mGAGE,8EAIA,gFAEF,8BAEE,mDAEF,4BAEE,yBAfF,yEACA,0BAEE,mDAEF,4BAEE,mDAEF,6BAEE,mDAEF,2BAEE,yBAfF,wEACA,yBAEE,mDAEF,2BAEE,+EAEF,mDAEE,0BAEF,yBAEE,uBAfF,8EACA,mDAEE,6BAEF,mDAEE,8BAEF,mDAEE,4BAEF,yBAEE,qBAMN,4EACA,mDAEE,2BAEF,mDAEE,+EAIA,mDAEF,mBAEE,mDChEJ,uBAGE,CACA,kDAKA,4ECRJ,8HAIA,2EACA,4BACA,iFCRE,mDAEA,+BDeE,mDACA,sDACA,0EAFA,8EACA,gFACA,8B1DqCA,mD0DvCA,4BACA,+CACA,6E1DqCA,mD0DvCA,4BACA,mDACA,gFAFA,4EACA,mDACA,+EAMJ,iFACA,+BACA,gFAIA,+CACA,6EACA,mDACA,+EACA,gFACA,2BAIA,kDEvCE,qDACE,iFAKI,8BALJ,oFvEUF,qDuEXA,6BACE,sGAKI,2BANN,qDACE,6BvEUF,qDuEXA,8BACE,iFAKI,gDANN,qDACE,0BvEUF,qDuEXA,4BACE,kFvEUF,qDuEXA,2BACE,kDvEUF,qDqEkCF,iFACA,8BAEA,qDACA,oFGnDE,6BAEA,0BACA,sBACA,qDHuDF,+EAGE,4BACA,qDAKF,6BIjEA,qDAIA,2BACE,4BIRS,qBASA,kFHyBT,yDGxBS,2BH6BP,yDAGA,4BAGF,yDGvCS,0BH6CT,wCAOE,uBALA,QAEF,CAGE,WAHF,OACE,mBAEA,CALA,gCAEF,SAGE,iCGjDO,gGHyDP,mHAGF,8BG3DS,4BH+DP,qHAEA,yBACE,6BAKF,0BACA,yDAGF,yBACE,8BAEA,yBACA,gCAGF,2BACE,2DACA,wDAEA,yBAKF,gCAIA,0BACE,4DAIA,wDAIA,yDAIA,+IAMA,yBAEA,0DAGF,iCACE,4BAIF,iCACE,kCAEA,iCAIA,kCAGF,kCACE,mCAIA,oCAGF,yBACE,sCAGF,6BAEE,qCACA,yBAIA,mCACA,yBAEA,qCAGA,4BACA,8BAGF,2BAEE,6BACA,mDAIA,uBAEA,2EAIA,+EAGF,+EAKE,6EAGF,2EAEE,uBAKA,mDAGF,qEAKE,uBAGF,+BACE,kGAIA,uBAIA,8BAGF,uBACE,yEAGA,uBAIA,6BAEA,uBACA,uEAKA,uBAGF,4BAEE,uBACA,qEAGA,uBAGF,4BACE,oDAIA,uDAIA,yBAIA,gCAGF,yBAKE,4BAKA,wBAGF,UAPE,WAGF,CAHE,WAGF,gBAIA,uCAEE,8BACA,6BAIA,+BAHA,+BAGA,6BAIA,uBACA,sDAIA,4BAEA,2BAGF,6BACE,kBAGF,CAHE,UAGF,CACE,2BACA,wBAGF,8BAIE,wBAIA,yBACA,kBAGF,CARE,WAHA,aACA,CACA,cACA,CAFA,YACA,CACA,oBAQF,8BAIA,aACE,CAJA,WAGF,gBACE,gDAEA,eACA,yBAGF,2CAIE,mCACA,iDAEA,kBACA,6CAIA,iDACA,CAFA,aAEA,6GAMF","sources":["../node_modules/tempusdominus-bootstrap-4/build/css/tempusdominus-bootstrap-4.min.css","pages/targets/ScrapePoolPanel.module.css","pages/targets/TargetLabels.module.css","thanos/pages/notFound/NotFound.module.css","thanos/pages/errorBoundary/ErrorBoundary.module.css","thanos/pages/blocks/blocks.module.css","../node_modules/rc-slider/assets/index.css","themes/app.scss","themes/light.scss","../node_modules/bootstrap/scss/_reboot.scss","../node_modules/bootstrap/scss/_variables.scss","../node_modules/bootstrap/scss/vendor/_rfs.scss","../node_modules/bootstrap/scss/mixins/_hover.scss","themes/_bootstrap_light.scss","../node_modules/bootstrap/scss/_root.scss","../node_modules/bootstrap/scss/_type.scss","../node_modules/bootstrap/scss/mixins/_lists.scss","../node_modules/bootstrap/scss/mixins/_image.scss","../node_modules/bootstrap/scss/_images.scss","../node_modules/bootstrap/scss/mixins/_border-radius.scss","../node_modules/bootstrap/scss/_code.scss","../node_modules/bootstrap/scss/mixins/_grid.scss","../node_modules/bootstrap/scss/_grid.scss","../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../node_modules/bootstrap/scss/mixins/_grid-framework.scss","../node_modules/bootstrap/scss/_tables.scss","../node_modules/bootstrap/scss/mixins/_table-row.scss","../node_modules/bootstrap/scss/_forms.scss","../node_modules/bootstrap/scss/mixins/_transition.scss","../node_modules/bootstrap/scss/mixins/_forms.scss","../node_modules/@forevolve/bootstrap-dark/scss/mixins-overrides/_dark-forms.scss","../node_modules/@forevolve/bootstrap-dark/scss/_form-overrides.scss","../node_modules/bootstrap/scss/_buttons.scss","../node_modules/bootstrap/scss/mixins/_buttons.scss","../node_modules/bootstrap/scss/_transitions.scss","../node_modules/bootstrap/scss/_dropdown.scss","../node_modules/bootstrap/scss/mixins/_caret.scss","../node_modules/bootstrap/scss/mixins/_nav-divider.scss","../node_modules/bootstrap/scss/_button-group.scss","../node_modules/bootstrap/scss/_input-group.scss","../node_modules/bootstrap/scss/_custom-forms.scss","../node_modules/bootstrap/scss/_nav.scss","../node_modules/bootstrap/scss/_navbar.scss","../node_modules/bootstrap/scss/_card.scss","../node_modules/bootstrap/scss/_breadcrumb.scss","../node_modules/bootstrap/scss/_pagination.scss","../node_modules/bootstrap/scss/mixins/_pagination.scss","../node_modules/bootstrap/scss/_badge.scss","../node_modules/bootstrap/scss/mixins/_badge.scss","../node_modules/bootstrap/scss/_jumbotron.scss","../node_modules/bootstrap/scss/_alert.scss","../node_modules/bootstrap/scss/mixins/_alert.scss","../node_modules/bootstrap/scss/_progress.scss","../node_modules/bootstrap/scss/mixins/_gradients.scss","../node_modules/bootstrap/scss/_media.scss","../node_modules/bootstrap/scss/_list-group.scss","../node_modules/bootstrap/scss/mixins/_list-group.scss","../node_modules/bootstrap/scss/_close.scss","../node_modules/bootstrap/scss/_toasts.scss","../node_modules/bootstrap/scss/_modal.scss","../node_modules/bootstrap/scss/_tooltip.scss","../node_modules/bootstrap/scss/mixins/_reset-text.scss","../node_modules/bootstrap/scss/_popover.scss","../node_modules/bootstrap/scss/_carousel.scss","../node_modules/bootstrap/scss/mixins/_clearfix.scss","../node_modules/bootstrap/scss/_spinners.scss","../node_modules/bootstrap/scss/utilities/_align.scss","../node_modules/bootstrap/scss/mixins/_background-variant.scss","../node_modules/bootstrap/scss/utilities/_background.scss","../node_modules/bootstrap/scss/utilities/_borders.scss","../node_modules/bootstrap/scss/utilities/_display.scss","../node_modules/bootstrap/scss/utilities/_embed.scss","../node_modules/bootstrap/scss/utilities/_flex.scss","../node_modules/bootstrap/scss/utilities/_float.scss","../node_modules/bootstrap/scss/utilities/_interactions.scss","../node_modules/bootstrap/scss/utilities/_position.scss","../node_modules/bootstrap/scss/mixins/_screen-reader.scss","../node_modules/bootstrap/scss/utilities/_shadows.scss","../node_modules/bootstrap/scss/utilities/_sizing.scss","../node_modules/bootstrap/scss/utilities/_spacing.scss","../node_modules/bootstrap/scss/utilities/_stretched-link.scss","../node_modules/bootstrap/scss/utilities/_text.scss","../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../node_modules/bootstrap/scss/mixins/_text-emphasis.scss","../node_modules/bootstrap/scss/mixins/_text-hide.scss","../node_modules/bootstrap/scss/utilities/_visibility.scss","themes/_shared.scss","themes/dark.scss","themes/_bootstrap_dark.scss","../node_modules/@forevolve/bootstrap-dark/scss/_dark-variables.scss","../node_modules/@forevolve/bootstrap-dark/scss/mixins/_dark-table-row.scss","../node_modules/@forevolve/bootstrap-dark/scss/_dark-tables.scss","../node_modules/@forevolve/bootstrap-dark/scss/_dark-input-group.scss"],"sourcesContent":["/*!@preserve\r\n * Tempus Dominus Bootstrap4 v5.39.0 (https://tempusdominus.github.io/bootstrap-4/)\r\n * Copyright 2016-2020 Jonathan Peterson and contributors\r\n * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE)\r\n */.bootstrap-datetimepicker-widget .btn[data-action=clear]::after,.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after,.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after,.bootstrap-datetimepicker-widget .btn[data-action=today]::after,.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after,.bootstrap-datetimepicker-widget .picker-switch::after,.bootstrap-datetimepicker-widget table th.next::after,.bootstrap-datetimepicker-widget table th.prev::after,.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}body.tempusdominus-bootstrap-datetimepicker-widget-day-click,body.tempusdominus-bootstrap-datetimepicker-widget-day-click *{cursor:pointer!important}body.tempusdominus-bootstrap-datetimepicker-widget-day-click{position:relative!important}.tempusdominus-bootstrap-datetimepicker-widget-day-click-glass-panel{position:absolute;z-index:999999999999;top:0;left:0;right:0;bottom:0;cursor:pointer!important}.bootstrap-datetimepicker-widget .datepicker-days tbody td{cursor:pointer}.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{display:block;margin:2px 0;padding:4px;width:14rem}.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons{width:16rem}.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks{width:16rem}.bootstrap-datetimepicker-widget.dropdown-menu.tempusdominus-bootstrap-datetimepicker-widget-with-calendar-weeks.tempusdominus-bootstrap-datetimepicker-widget-with-feather-icons{width:17rem}@media (min-width:576px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:after,.bootstrap-datetimepicker-widget.dropdown-menu:before{content:\"\";display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #fff;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.float-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.float-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget.dropdown-menu.wider{width:16rem}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:700;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]{text-align:center;font-family:Arial,sans-serif,-apple-system,system-ui,\"Segoe UI\",Roboto,\"Helvetica Neue\",\"Noto Sans\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",\"Noto Color Emoji\";width:38px;height:38px}.bootstrap-datetimepicker-widget .btn[data-action=incrementHours]::after{content:\"Increment Hours\"}.bootstrap-datetimepicker-widget .btn[data-action=incrementMinutes]::after{content:\"Increment Minutes\"}.bootstrap-datetimepicker-widget .btn[data-action=decrementHours]::after{content:\"Decrement Hours\"}.bootstrap-datetimepicker-widget .btn[data-action=decrementMinutes]::after{content:\"Decrement Minutes\"}.bootstrap-datetimepicker-widget .btn[data-action=showHours]::after{content:\"Show Hours\"}.bootstrap-datetimepicker-widget .btn[data-action=showMinutes]::after{content:\"Show Minutes\"}.bootstrap-datetimepicker-widget .btn[data-action=togglePeriod]::after{content:\"Toggle AM/PM\"}.bootstrap-datetimepicker-widget .btn[data-action=clear]::after{content:\"Clear the picker\"}.bootstrap-datetimepicker-widget .btn[data-action=today]::after{content:\"Set the date to today\"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{content:\"Toggle Date and Time Screens\"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget .picker-switch.picker-switch-with-feathers-icons td span{line-height:2.8;height:2.8em}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:.25rem}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{content:\"Previous Month\"}.bootstrap-datetimepicker-widget table th.next::after{content:\"Next Month\"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#e9ecef}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#6c757d;cursor:default}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#e9ecef;cursor:pointer}.bootstrap-datetimepicker-widget table td.new,.bootstrap-datetimepicker-widget table td.old{color:#6c757d}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:\"\";display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#007bff;border-top-color:rgba(0,0,0,.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#007bff;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin-top:2px;margin-bottom:2px;cursor:pointer;border-radius:.25rem}.bootstrap-datetimepicker-widget table td span:hover{background:#e9ecef}.bootstrap-datetimepicker-widget table td span.active{background-color:#007bff;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.bootstrap-datetimepicker-widget table td span.old{color:#6c757d}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:0 0;color:#6c757d;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn{color:#007bff;color:var(--blue,#007bff)}.bootstrap-datetimepicker-widget .timepicker .timepicker-picker a.btn:hover{color:#0056b3}.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod],.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second{pointer-events:none;cursor:default}.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=decrementSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=incrementSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showHours]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showMinutes]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=showSeconds]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td [data-action=togglePeriod]:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.day:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.hour:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.minute:hover,.bootstrap-datetimepicker-widget.bootstrap-datetimepicker-widget-readonly table td.second:hover{background:0 0}.input-group [data-toggle=datetimepicker]{cursor:pointer}",".container {\n margin-top: -12px;\n}\n\n.title {\n font-size: 20px;\n font-weight: bold;\n cursor: pointer;\n}\n\n.normal {\n composes: title;\n}\n\n.danger {\n composes: title;\n color: rgb(242, 65, 65);\n}\n\n.table {\n width: 100%;\n}\n\n.cell {\n height: auto;\n word-wrap: break-word;\n word-break: break-all;\n}\n\n.endpoint, .labels {\n composes: cell;\n width: 25%;\n}\n\n.state, .last-scrape {\n composes: cell;\n width: 10%;\n}\n\n.errors {\n composes: cell;\n width: 30%;\n}\n",".discovered {\n white-space: nowrap;\n}\n",".container{\n width: 100%;\n height: 85vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}",".container {\n display: flex;\n min-height: 100vh;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n\nbutton.detailsBtn {\n font-size: 1.2em;\n margin: 2em 0;\n}\n\n.errorDiv {\n white-space: pre-wrap;\n font-family: monospace;\n}\n",".container {\n display: flex;\n --top: 72px;\n min-height: calc(100vh - var(--top));\n position: relative;\n z-index: 1;\n}\n\n.grid {\n width: 100%;\n}\n\n.sources {\n max-height: calc(100vh - 2 * var(--top));\n overflow-y: auto;\n scrollbar-color: #b1b1b1 transparent;\n scrollbar-width: thin;\n}\n\n.sources::-webkit-scrollbar {\n width: 8px;\n}\n\n.sources::-webkit-scrollbar-thumb {\n background-color: #b1b1b1;\n border-radius: 6px;\n}\n\n.blockDetails {\n width: 0;\n overflow-x: hidden;\n overflow-y: auto;\n min-width: 0;\n max-width: 55vw;\n box-sizing: border-box;\n transition: all 0.2s ease-in-out;\n margin-top: -16px;\n margin-right: -15px;\n}\n\n.blockDetails.open {\n min-width: 420px;\n padding: 2em;\n box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);\n}\n\n.detailsTop {\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap-reverse;\n}\n\n.header {\n margin: 0;\n padding: 0;\n font-weight: 700;\n font-size: 1.1em;\n}\n\n.closeBtn {\n border: none;\n background: none;\n font-size: 2em;\n transform: translateY(-10%);\n}\n\n.timeRangeDiv {\n box-sizing: border-box;\n padding: 0em 3em;\n display: flex;\n justify-content: space-evenly;\n flex-direction: column;\n align-items: center;\n height: var(--top);\n}\n\n.timeRange {\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 0.9em;\n width: 100%;\n}\n\n.source {\n width: 100%;\n display: flex;\n align-items: center;\n}\n\n.title {\n box-sizing: border-box;\n padding: 0 1em;\n}\n\n.title > span {\n display: block;\n width: 8vw;\n margin: 0;\n text-align: center;\n text-overflow: ellipsis;\n overflow: hidden;\n box-sizing: border-box;\n}\n\n.rowsContainer {\n display: flex;\n flex-direction: column;\n width: 100%;\n box-sizing: border-box;\n border-left: solid 3px teal;\n}\n\n.row {\n width: 100%;\n position: relative;\n --block-height: 1.2em;\n height: var(--block-height);\n box-sizing: content-box;\n margin: 0.1em 0;\n overflow-x: hidden;\n}\n\n.blockSpan {\n position: absolute;\n border: none;\n height: 100%;\n min-width: 0.5%;\n padding: 0;\n margin: 0;\n min-width: 0;\n box-sizing: border-box;\n mix-blend-mode: multiply;\n}\n\n.blockSpan:hover,\n.blockSpan:focus {\n outline: none;\n box-shadow: 0 0 0 0.2rem rgba(0, 0, 0, 0.3) inset;\n}\n\n/*\n* block colors\n* https://coolors.co/9b5de5-f15bb5-fee440-00bbf9-00f5d4\n*/\n.res-0 {\n --level-1: #bd96ee;\n --level-2: #9250e2;\n --level-3: #7c2cdd;\n --level-4: #681fc1;\n --level-5: #4c178c;\n --level-6: #391169;\n}\n\n.res-300000 {\n --level-1: #f15bb5;\n --level-2: #ef43aa;\n --level-3: #eb1e99;\n --level-4: #ce1283;\n --level-5: #a90f6b;\n --level-6: #830b53;\n}\n\n.res-3600000 {\n --level-1: #70dbff;\n --level-2: #47d1ff;\n --level-3: #1fc7ff;\n --level-4: #00b8f5;\n --level-5: #0099cc;\n --level-6: #007aa3;\n}\n\n.level-1 {\n background: var(--level-1);\n}\n.level-2 {\n background: var(--level-2);\n}\n.level-3 {\n background: var(--level-3);\n}\n.level-4 {\n background: var(--level-4);\n}\n.level-5 {\n background: var(--level-5);\n}\n.level-6 {\n background: var(--level-6);\n}\n\n.blockInput {\n margin-bottom: 12px;\n}\n\n.blockFilter {\n display: flex;\n flex-direction: row;\n align-items: center;\n}\n",".rc-slider {\n position: relative;\n height: 14px;\n padding: 5px 0;\n width: 100%;\n border-radius: 6px;\n touch-action: none;\n box-sizing: border-box;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n.rc-slider * {\n box-sizing: border-box;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n.rc-slider-rail {\n position: absolute;\n width: 100%;\n background-color: #e9e9e9;\n height: 4px;\n border-radius: 6px;\n}\n.rc-slider-track {\n position: absolute;\n left: 0;\n height: 4px;\n border-radius: 6px;\n background-color: #abe2fb;\n}\n.rc-slider-handle {\n position: absolute;\n width: 14px;\n height: 14px;\n cursor: pointer;\n cursor: -webkit-grab;\n margin-top: -5px;\n cursor: grab;\n border-radius: 50%;\n border: solid 2px #96dbfa;\n background-color: #fff;\n touch-action: pan-x;\n}\n.rc-slider-handle-dragging.rc-slider-handle-dragging.rc-slider-handle-dragging {\n border-color: #57c5f7;\n box-shadow: 0 0 0 5px #96dbfa;\n}\n.rc-slider-handle:focus {\n outline: none;\n}\n.rc-slider-handle-click-focused:focus {\n border-color: #96dbfa;\n box-shadow: unset;\n}\n.rc-slider-handle:hover {\n border-color: #57c5f7;\n}\n.rc-slider-handle:active {\n border-color: #57c5f7;\n box-shadow: 0 0 5px #57c5f7;\n cursor: -webkit-grabbing;\n cursor: grabbing;\n}\n.rc-slider-mark {\n position: absolute;\n top: 18px;\n left: 0;\n width: 100%;\n font-size: 12px;\n}\n.rc-slider-mark-text {\n position: absolute;\n display: inline-block;\n vertical-align: middle;\n text-align: center;\n cursor: pointer;\n color: #999;\n}\n.rc-slider-mark-text-active {\n color: #666;\n}\n.rc-slider-step {\n position: absolute;\n width: 100%;\n height: 4px;\n background: transparent;\n}\n.rc-slider-dot {\n position: absolute;\n bottom: -2px;\n margin-left: -4px;\n width: 8px;\n height: 8px;\n border: 2px solid #e9e9e9;\n background-color: #fff;\n cursor: pointer;\n border-radius: 50%;\n vertical-align: middle;\n}\n.rc-slider-dot-active {\n border-color: #96dbfa;\n}\n.rc-slider-dot-reverse {\n margin-right: -4px;\n}\n.rc-slider-disabled {\n background-color: #e9e9e9;\n}\n.rc-slider-disabled .rc-slider-track {\n background-color: #ccc;\n}\n.rc-slider-disabled .rc-slider-handle,\n.rc-slider-disabled .rc-slider-dot {\n border-color: #ccc;\n box-shadow: none;\n background-color: #fff;\n cursor: not-allowed;\n}\n.rc-slider-disabled .rc-slider-mark-text,\n.rc-slider-disabled .rc-slider-dot {\n cursor: not-allowed !important;\n}\n.rc-slider-vertical {\n width: 14px;\n height: 100%;\n padding: 0 5px;\n}\n.rc-slider-vertical .rc-slider-rail {\n height: 100%;\n width: 4px;\n}\n.rc-slider-vertical .rc-slider-track {\n left: 5px;\n bottom: 0;\n width: 4px;\n}\n.rc-slider-vertical .rc-slider-handle {\n margin-left: -5px;\n touch-action: pan-y;\n}\n.rc-slider-vertical .rc-slider-mark {\n top: 0;\n left: 18px;\n height: 100%;\n}\n.rc-slider-vertical .rc-slider-step {\n height: 100%;\n width: 4px;\n}\n.rc-slider-vertical .rc-slider-dot {\n left: 2px;\n margin-bottom: -4px;\n}\n.rc-slider-vertical .rc-slider-dot:first-child {\n margin-bottom: -4px;\n}\n.rc-slider-vertical .rc-slider-dot:last-child {\n margin-bottom: -4px;\n}\n.rc-slider-tooltip-zoom-down-enter,\n.rc-slider-tooltip-zoom-down-appear {\n animation-duration: 0.3s;\n animation-fill-mode: both;\n display: block !important;\n animation-play-state: paused;\n}\n.rc-slider-tooltip-zoom-down-leave {\n animation-duration: 0.3s;\n animation-fill-mode: both;\n display: block !important;\n animation-play-state: paused;\n}\n.rc-slider-tooltip-zoom-down-enter.rc-slider-tooltip-zoom-down-enter-active,\n.rc-slider-tooltip-zoom-down-appear.rc-slider-tooltip-zoom-down-appear-active {\n animation-name: rcSliderTooltipZoomDownIn;\n animation-play-state: running;\n}\n.rc-slider-tooltip-zoom-down-leave.rc-slider-tooltip-zoom-down-leave-active {\n animation-name: rcSliderTooltipZoomDownOut;\n animation-play-state: running;\n}\n.rc-slider-tooltip-zoom-down-enter,\n.rc-slider-tooltip-zoom-down-appear {\n transform: scale(0, 0);\n animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);\n}\n.rc-slider-tooltip-zoom-down-leave {\n animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);\n}\n@keyframes rcSliderTooltipZoomDownIn {\n 0% {\n opacity: 0;\n transform-origin: 50% 100%;\n transform: scale(0, 0);\n }\n 100% {\n transform-origin: 50% 100%;\n transform: scale(1, 1);\n }\n}\n@keyframes rcSliderTooltipZoomDownOut {\n 0% {\n transform-origin: 50% 100%;\n transform: scale(1, 1);\n }\n 100% {\n opacity: 0;\n transform-origin: 50% 100%;\n transform: scale(0, 0);\n }\n}\n.rc-slider-tooltip {\n position: absolute;\n left: -9999px;\n top: -9999px;\n visibility: visible;\n box-sizing: border-box;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n.rc-slider-tooltip * {\n box-sizing: border-box;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n.rc-slider-tooltip-hidden {\n display: none;\n}\n.rc-slider-tooltip-placement-top {\n padding: 4px 0 8px 0;\n}\n.rc-slider-tooltip-inner {\n padding: 6px 2px;\n min-width: 24px;\n height: 24px;\n font-size: 12px;\n line-height: 1;\n color: #fff;\n text-align: center;\n text-decoration: none;\n background-color: #6c6c6c;\n border-radius: 6px;\n box-shadow: 0 0 4px #d9d9d9;\n}\n.rc-slider-tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow {\n bottom: 4px;\n left: 50%;\n margin-left: -4px;\n border-width: 4px 4px 0;\n border-top-color: #6c6c6c;\n}\n","/* THIS FILE WAS COPIED INTO THANOS FROM PROMETHEUS \n (LIVING AT https://github.com/prometheus/prometheus/blob/main/web/ui/react-app/src/themes/app.scss),\n PROMETHEUS CODE WAS LICENSED UNDER AN APACHE 2.0 LICENSE, SEE\n https://github.com/prometheus/prometheus/blob/main/LICENSE.\n*/\n\n/* This file contains styles that are applied to root document, which cannot be\n nested under theme selectors. */\n\n html {\n /* https://github.com/prometheus/prometheus/issues/7434 */\n /* Scroll to hash-fragment-links counting the fixed navbar 40px tall with 16px padding */\n scroll-padding-top: 56px;\n }\n \n /* Font used for autocompletion item icons. */\n @font-face {\n font-family: 'codicon';\n src: local('codicon'), url(../fonts/codicon.ttf) format('truetype');\n }","/* THIS FILE WAS COPIED INTO THANOS FROM PROMETHEUS \n (LIVING AT https://github.com/prometheus/prometheus/blob/main/web/ui/react-app/src/themes/light.scss),\n PROMETHEUS CODE WAS LICENSED UNDER AN APACHE 2.0 LICENSE, SEE\n https://github.com/prometheus/prometheus/blob/main/LICENSE.\n*/\n@import 'bootstrap_light';\n\n@import '~bootstrap/scss/functions';\n@import '~bootstrap/scss/variables';\n\n$alert-cell-color: inherit;\n$rule-cell-bg: #f5f5f5;\n\n$config-yaml-color: #333;\n$config-yaml-bg: #f5f5f5;\n$config-yaml-border: #ccc;\n\n$query-stats-color: #71808e;\n\n$metrics-explorer-bg: #efefef;\n\n$clear-time-btn-bg: $white;\n\n.bootstrap {\n @import './shared';\n}","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -webkit-tap-highlight-color: rgba($black, 0); // 5\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\n// TODO: remove in v5\n// stylelint-disable-next-line selector-list-comma-newline-after\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use\n// the `inherit` value on things like `` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n @include font-size($font-size-base);\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline\n// on elements that programmatically receive focus but wouldn't normally show a visible\n// focus outline. In general, this would mean that the outline is only applied if the\n// interaction that led to the element receiving programmatic focus was a keyboard interaction,\n// or the browser has somehow determined that the user is primarily a keyboard user and/or\n// wants focus outlines to always be presented.\n//\n// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible\n// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/\n[tabindex=\"-1\"]:focus:not(:focus-visible) {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable-next-line selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Duplicate behavior to the data-* attribute for our tooltip plugin\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Remove the bottom border in Firefox 39-.\n// 5. Prevent the text-decoration to be skipped.\n\nabbr[title],\nabbr[data-original-title] { // 1\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 4\n text-decoration-skip-ink: none; // 5\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n @include font-size(80%); // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n @include font-size(75%);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n\n @include hover() {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n color: inherit;\n text-decoration: none;\n\n @include hover() {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // Disable auto-hiding scrollbar in IE & legacy Edge to avoid overlap,\n // making it impossible to interact with the content\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// Set the cursor for non-`